Normal ifade doğrulayan normal ifade [kapalı]


17

Normal ifade dizesini girdi olarak kabul edecek bir normal ifade oluşturun ve geçerli olup olmadığını kontrol edin. Temel olarak, normal ifadeniz kendini doğrulayabilmelidir. (Geçersiz herhangi bir normal ifade doğrulanmamalıdır, bu nedenle kullanamazsınız .*.))

Lezzetiniz iyi bilinen uygulamalar (Perl, sed, grep, gawk, vb.) Tarafından tam olarak desteklenmeli ve bu uygulamaların desteklediklerini tam olarak desteklemelidir. [Avukatın konuşmasından endişe etmeyin; Sadece akıllı ***'lar için olası boşlukları kaldırmaya çalışıyorum.]


Ben olurdu, ama zengin özellikli lezzetleri bilen ve kullananlara bir kenar verecek endişeli. Yoksa endişelerim asılsız mı?


8
mümkün değil, keyfi yuvalama parantezleri normal ifadeyi bağlamsız bir dilbilgisi yapar (bir cila gösterimi ile değiştirmek de bir yığın gerektirir)
cırcır ucube

@ratchet Augh, haklı olabilirsin.
Mateen Ulhaq

1
Parantez eşleşmesine izin verebilecek normal dillerdeki bazı uzantılar var, ancak nasıl yapılacağını bilmiyorum
cırcır ucube

8
Perl regexes ile mümkün olması gerekir.
Peter Taylor

1
@BrianVandenberg modern dillerde uygulanan düzenli ifadelerin hepsi normal değildir ... geri referanslar eklediğinizde, normal olmayan dillerle eşleşebilirsiniz. Dahası, hem Perl / PCRE hem de .NET doğru yuvalamaya uyacak kadar güçlüdür.
Martin Ender

Yanıtlar:


22

Yakut

Ruby'nin regex lezzetinin gerçek sözdizimini olabildiğince eşleştirmeye çalıştım, ancak birkaç tuhaflık var: aslında geçersiz (gibi (?<=(?<!))) olan birkaç bakış açısını kabul ediyor ve boş karakter aralıklarını tanıyor D-A. İkincisi ASCII için sabitlenebilir, ancak normal ifade olduğu gibi yeterince uzundur.

\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

Okunamayan sürüm:

\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
İkisi de okunamayan sürüm değil mi?
Kibbee

2
@Kibbee Normal regex'i iyi biliyorsanız ilk okunabilirlik makul olarak okunabilir.
Lowjacker

1
Bu, geçersiz sayısal referansların olmamasını nasıl sağlar?
Martin Ender

1
Sanırım öyle değil. Sonra yine, sahip olduğu tek sınırlama bu değildir (yukarıya bakınız). Bazı şeyler düzeltilebilir, ancak normal ifade gülünç derecede uzayacaktır.
Lowjacker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.