রেজেক্স বৈধকরণের রেজেক্স [বন্ধ]


17

একটি রেজেক্স তৈরি করুন যা কোনও রেজেক্স স্ট্রিংটিকে ইনপুট হিসাবে গ্রহণ করবে এবং এটি বৈধ কিনা তা পরীক্ষা করবে। মূলত, আপনার রেজেক্স নিজেই যাচাই করতে সক্ষম হওয়া উচিত। (কোনও অবৈধ রেইগেক্স বৈধ হওয়া উচিত নয়, সুতরাং আপনি ব্যবহার করতে পারবেন না .*;))

আপনার স্বাদটি অবশ্যই সুপরিচিত বাস্তবায়নগুলি (পার্ল, সেড, গ্রেপ, গাওক, ইত্যাদি) দ্বারা সম্পূর্ণরূপে সমর্থিত হওয়া উচিত এবং এই প্রয়োগগুলি কী সমর্থন করে তা সম্পূর্ণ সমর্থন করতে হবে। [উকিলের কথা বলার বিষয়ে চিন্তা করবেন না; আমি কেবল স্মার্ট *** এস এর জন্য যে কোনও সম্ভাব্য লফোলগুলি অপসারণ করার চেষ্টা করছি


আমি এটি করব তবে আমি চিন্তিত যে এটি অ-বৈশিষ্ট্য সমৃদ্ধ স্বাদগুলি যারা জানেন এবং তাদের ব্যবহার করেন তাদের পক্ষে এটি একটি প্রান্ত দেবে। নাকি আমার উদ্বেগ ভিত্তিহীন?


8
সম্ভব নয়, নির্বিচারে নেস্টিং বন্ধনীগুলি একটি রেজেক্সকে একটি প্রসঙ্গমুক্ত ব্যাকরণ তৈরি করে (এটি একটি পোলিশ স্বরলিপি দিয়ে প্রতিস্থাপনের জন্য একটি স্ট্যাকও প্রয়োজন)
র‌্যাচেট ফ্রিক

@ আরচেত আউহ, আপনি ঠিক থাকতে পারেন
মতিন উলহাক

1
নিয়মিত ভাষাগুলিতে কিছু এক্সটেনশান উপস্থিত রয়েছে যা বন্ধনীগুলির সাথে মিলে যাওয়ার অনুমতি দিতে পারে তবে আমি কীভাবে এটি করব তা জানি না
ratchet freak

8
পার্ল রেজেক্সেস দিয়ে এটি সম্ভব হতে বাধ্য।
পিটার টেলর

1
@ ব্রায়ানভেনডেনবার্গ আধুনিক ভাষায় বাস্তবায়িত নিয়মিত প্রকাশগুলি সমস্ত অ-নিয়মিত ... আপনি ব্যাক-রেফারেন্স যুক্ত করার সাথে সাথে আপনি অ-নিয়মিত ভাষাগুলির সাথে মিল রাখতে পারবেন। তদতিরিক্ত, পার্ল / পিসিআরই এবং .NET উভয়ই সঠিক নেস্টিংয়ের সাথে মেলে যথেষ্ট শক্তিশালী।
মার্টিন ইন্ডার

উত্তর:


22

চুনি

আমি যতটা সম্ভব রুবির রেগেক্স ফ্লেভারের আসল সিনট্যাক্সের সাথে মেলানোর চেষ্টা করেছি, তবে কয়েকটি কুইর্ক রয়েছে: এটি কয়েকটি লুকবাইন্ডগুলি গ্রহণ করে যা আসলে অবৈধ (মত (?<=(?<!))), এবং এটি খালি চরিত্রের সীমাগুলি সনাক্ত করে D-A। পরেরটি ASCII এর জন্য স্থির করা যেতে পারে তবে রেজেক্স এটি দীর্ঘ হিসাবে যথেষ্ট।

\A(?<main>
    (?!
        \{(\d+)?,(\d+)?\} # do not match lone counted repetition
    )
    (?:
        [^()\[\]\\*+?|<'] | # anything but metacharacters
        (?<cclass>
            \[ \^? (?: # character class
                (?: # character class
                    [^\[\]\\-] | # anything but square brackets,  backslashes or dashes
                    \g<esc> |
                    \[ : \^? (?: # POSIX char-class
                        alnum | alpha | word | blank | cntrl | x?digit | graph | lower | print | punct | space | upper
                    ) : \] |
                    - (?!
                        \\[dwhsDWHS]
                    ) # range / dash not succeeded by a character class
                )+ |
                \g<cclass> # more than one bracket as delimiter
            ) \]
        ) |
        (?<esc>
            \\[^cuxkg] | # any escaped character
            \\x \h\h? | # hex escape
            \\u \h{4} | # Unicode escape
            \\c . # control escape
        ) |
        \\[kg] (?:
            < \w[^>]* (?: > | \Z) |
            ' \w[^']* (?: ' | \Z)
        )? | # named backrefs
        (?<! (?<! \\) \\[kg]) [<'] | # don't match < or ' if preceded by \k or \g
        \| (?! \g<rep> ) | # alternation
        \( (?: # group
            (?:
                \?
                (?:
                    [>:=!] | # atomic / non-capturing / lookahead
                    (?<namedg>
                        < [_a-zA-Z][^>]* > |
                        ' [_a-zA-Z][^']* ' # named group
                    ) |
                    [xmi-]+: # regex options
                )
            )?
            \g<main>*
        ) \) |
        \(\?<[!=] (?<lbpat>
            (?! \{(\d+)?,(\d+)?\} )
            [^()\[\]\\*+?] |
            \g<esc>  (?<! \\[zZ]) |
            \g<cclass> |
            \( (?: # group
                (?:
                    \?: |
                    \? \g<namedg> |
                    \? <[!=]
                )?
                \g<lbpat>*
            ) \) |
            \(\?\# [^)]* \)
        )* \)
        |
        \(\? [xmi-]+ \) # option group
        (?! \g<rep> ) 
        |
        \(\?\# [^)]*+ \) # comment
        (?! \g<rep> )
    )+
    (?<rep>
        (?:
            [*+?] | # repetition
            \{(\d+)?,(\d+)?\} # counted repetition
        )
        [+?]? # with a possessive/lazy modifier
    )?
)*\Z

অপঠনযোগ্য সংস্করণ:

\A(?<main>(?!\{(\d+)?,(\d+)?\})(?:[^()\[\]\\*+?|<']|(?<cclass>\[\^?(?:(?:[^\[\]\\-]|\g<esc>|\[:\^?(?:alnum|alpha|word|blank|cntrl|x?digit|graph|lower|print|punct|space|upper):\]|-(?!\\[dwhsDWHS]))+|\g<cclass>)\])|(?<esc>\\[^cuxkg]|\\x\h\h?|\\u\h{4}|\\c.)|\\[kg](?:<\w[^>]*(?:>|\Z)|'\w[^']*(?:'|\Z))?|(?<!(?<!\\)\\[kg])[<']|\|(?!\g<rep>)|\((?:(?:\?(?:[>:=!]|(?<namedg><[_a-zA-Z][^>]*>|'[_a-zA-Z][^']*')|[xmi-]+:))?\g<main>*)\)|\(\?<[!=](?<lbpat>(?!\{(\d+)?,(\d+)?\})[^()\[\]\\*+?]|\g<esc>(?<!\\[zZ])|\g<cclass>|\((?:(?:\?:|\?\g<namedg>|\?<[!=])?\g<lbpat>*)\)|\(\?#[^)]*\))*\)|\(\?[xmi-]+\)(?!\g<rep>)|\(\?#[^)]*+\)(?!\g<rep>))+(?<rep>(?:[*+?]|\{(\d+)?,(\d+)?\})[+?]?)?)*\Z

28
তারা উভয়ই অপঠনযোগ্য সংস্করণ নয়?
কিব্বি

2
@ কিব্বি প্রথমটিটি যুক্তিসঙ্গতভাবে পঠনযোগ্য যদি আপনি রেজেক্সকে ভালভাবে জানেন।
লোজ্যাকার

1
এটি কীভাবে নিশ্চিত করে যে কোনও অবৈধ সংখ্যার পিছনে আছে?
মার্টিন ইন্ডার

1
আমার ধারণা এটি হয় না। তারপরে আবার এটি কেবল সীমাবদ্ধতা নয় (উপরে দেখুন)। কিছু জিনিস ঠিক করা যেতে পারে, কিন্তু রেজেক্স হাস্যকরভাবে দীর্ঘ হয়ে যাবে।
লোজ্যাকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.