Czy istnieje wyrażenie regularne do wykrywania poprawnego wyrażenia regularnego?

Czy możliwe jest wykrycie poprawnego wyrażenia regularnego za pomocą innego wyrażenia regularnego? Jeśli tak, proszę podać przykładowy kod poniżej.

 625
Author: xav, 2008-10-05

8 answers

/
^                                             # start of string
(                                             # first group start
  (?:
    (?:[^?+*{}()[\]\\|]+                      # literals and ^, $
     | \\.                                    # escaped characters
     | \[ (?: \^?\\. | \^[^\\] | [^\\^] )     # character classes
          (?: [^\]\\]+ | \\. )* \]
     | \( (?:\?[:=!]|\?<[=!]|\?>)? (?1)?? \)  # parenthesis, with recursive content
     | \(\? (?:R|[+-]?\d+) \)                 # recursive matching
     )
    (?: (?:[?+*]|\{\d+(?:,\d*)?\}) [?+]? )?   # quantifiers
  | \|                                        # alternative
  )*                                          # repeat content
)                                             # end first group
$                                             # end of string
/

Jest to rekurencyjne Wyrażenie regularne i nie jest obsługiwane przez wiele silników regex. Te oparte na PCRE powinny go wspierać.

Bez spacji i komentarzy:

/^((?:(?:[^?+*{}()[\]\\|]+|\\.|\[(?:\^?\\.|\^[^\\]|[^\\^])(?:[^\]\\]+|\\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>)?(?1)??\)|\(\?(?:R|[+-]?\d+)\))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*)$/

. NET nie obsługuje bezpośrednio rekurencji. (Konstrukcje (?1) i (?R).) Rekurencja musiałaby być przekonwertowana do zliczania zbalansowanych grup:

^                                         # start of string
(?:
  (?: [^?+*{}()[\]\\|]+                   # literals and ^, $
   | \\.                                  # escaped characters
   | \[ (?: \^?\\. | \^[^\\] | [^\\^] )   # character classes
        (?: [^\]\\]+ | \\. )* \]
   | \( (?:\?[:=!]
         | \?<[=!]
         | \?>
         | \?<[^\W\d]\w*>
         | \?'[^\W\d]\w*'
         )?                               # opening of group
     (?<N>)                               #   increment counter
   | \)                                   # closing of group
     (?<-N>)                              #   decrement counter
   )
  (?: (?:[?+*]|\{\d+(?:,\d*)?\}) [?+]? )? # quantifiers
| \|                                      # alternative
)*                                        # repeat content
$                                         # end of string
(?(N)(?!))                                # fail if counter is non-zero.

Zagęszczony:

^(?:(?:[^?+*{}()[\]\\|]+|\\.|\[(?:\^?\\.|\^[^\\]|[^\\^])(?:[^\]\\]+|\\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>|\?<[^\W\d]\w*>|\?'[^\W\d]\w*')?(?<N>)|\)(?<-N>))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*$(?(N)(?!))
 633
Author: Markus Jarderot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-29 17:12:34

Mało prawdopodobne.

Oceń go w {[0] } lub w dowolnym języku.

 223
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-05 17:14:09

Nie, jeśli ściśle mówisz o wyrażeniach regularnych i nie uwzględniasz niektórych implementacji wyrażeń regularnych, które w rzeczywistości są gramatykami bezkontekstowymi.

Istnieje jedno ograniczenie wyrażeń regularnych, które uniemożliwia zapisanie wyrażeń regularnych, które pasują do wszystkich i tylko wyrażeń regularnych. Nie można dopasować implementacji, takich jak sparowane szelki. Wyrażenia regularne używają wielu takich konstrukcji, weźmy jako przykład []. Ilekroć istnieje [musi być dopasowanie]. Dość proste for a regex "[.*]".

Niemożliwe dla wyrażeń regularnych jest to, że mogą być zagnieżdżone. Jak napisać Wyrażenie regularne pasujące do zagnieżdżonych nawiasów? Odpowiedź jest taka, że nie możesz bez nieskończenie długiego wyrażenia regularnego. Możesz dopasować dowolną liczbę zagnieżdżonych nawiasów za pomocą brute force, ale nigdy nie możesz dopasować arbitralnie długiego zestawu zagnieżdżonych nawiasów.

Ta funkcja jest często określana jako liczenie (liczysz głębokość zagnieżdżenia). Regex z definicji nie ma możliwość liczenia.

Edytuj: Skończyło się na napisaniu posta na blogu o tym: ograniczenia wyrażeń regularnych

 147
Author: JaredPar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-06 17:59:51

Dobre pytanie. Prawdziwe języki regularne nie mogą decydować arbitralnie głęboko zagnieżdżone dobrze uformowany nawias. Jeśli twój alfabet zawiera '(' i')', celem jest ustalenie, czy ciąg z nich ma dobrze uformowany nawias. Ponieważ jest to wymóg konieczny dla wyrażeń regularnych, odpowiedź brzmi nie.

Jednakże: jeśli poluzujesz wymóg i dodasz rekurencję, prawdopodobnie możesz to zrobić. Powodem jest to, że rekurencja może działać jako "stos" pozwalający "policzyć" bieżący głębokość zagnieżdżania naciskając na ten stos.

Russ Cox napisał wspaniały Traktat o implementacji silnika regex: dopasowywanie wyrażeń regularnych może być proste i szybkie

 36
Author: I GIVE CRAP ANSWERS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-05 17:38:50

Chociaż jest całkowicie możliwe użycie rekurencyjnego wyrażenia regularnego, jak opublikował MizardX, dla tego rodzaju rzeczy jest o wiele bardziej przydatny parser. Wyrażenia regularne były pierwotnie przeznaczone do użycia z językami regularnymi, będąc rekurencyjne lub posiadające grupy równoważące to tylko łatka.

Język, który definiuje poprawne wyrażenia regularne, jest w rzeczywistości gramatyką bezkontekstową i powinieneś użyć odpowiedniego parsera do obsługi GO. Oto przykład projektu uniwersyteckiego do parsowania prostych wyrażeń regularnych (bez większość konstrukcji). Używa JavaCC. I tak, komentarze są w języku hiszpańskim, choć nazwy metod są dość oczywiste.

SKIP :
{
    " "
|   "\r"
|   "\t"
|   "\n"
}
TOKEN : 
{
    < DIGITO: ["0" - "9"] >
|   < MAYUSCULA: ["A" - "Z"] >
|   < MINUSCULA: ["a" - "z"] >
|   < LAMBDA: "LAMBDA" >
|   < VACIO: "VACIO" >
}

IRegularExpression Expression() :
{
    IRegularExpression r; 
}
{
    r=Alternation() { return r; }
}

// Matchea disyunciones: ER | ER
IRegularExpression Alternation() :
{
    IRegularExpression r1 = null, r2 = null; 
}
{
    r1=Concatenation() ( "|" r2=Alternation() )?
    { 
        if (r2 == null) {
            return r1;
        } else {
            return createAlternation(r1,r2);
        } 
    }
}

// Matchea concatenaciones: ER.ER
IRegularExpression Concatenation() :
{
    IRegularExpression r1 = null, r2 = null; 
}
{
    r1=Repetition() ( "." r2=Repetition() { r1 = createConcatenation(r1,r2); } )*
    { return r1; }
}

// Matchea repeticiones: ER*
IRegularExpression Repetition() :
{
    IRegularExpression r; 
}
{
    r=Atom() ( "*" { r = createRepetition(r); } )*
    { return r; }
}

// Matchea regex atomicas: (ER), Terminal, Vacio, Lambda
IRegularExpression Atom() :
{
    String t;
    IRegularExpression r;
}
{
    ( "(" r=Expression() ")" {return r;}) 
    | t=Terminal() { return createTerminal(t); }
    | <LAMBDA> { return createLambda(); }
    | <VACIO> { return createEmpty(); }
}

// Matchea un terminal (digito o minuscula) y devuelve su valor
String Terminal() :
{
    Token t;
}
{
    ( t=<DIGITO> | t=<MINUSCULA> ) { return t.image; }
}
 7
Author: Santiago Palladino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-06 14:15:26

Możesz przesłać Wyrażenie regularne do preg_match, które zwróci false, jeśli wyrażenie regularne nie jest poprawne. Nie zapomnij użyć'@', aby stłumić komunikaty o błędach:

@preg_match($regexToTest, '');
  • zwróci 1, jeśli regex to '//'.
  • zwróci 0, jeśli regex jest w porządku.
  • zwróci false w przeciwnym razie.
 5
Author: Richard - Rogue Wave Limited,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-28 18:09:37

Ten Przykład na pyparsing wiki daje gramatykę do parsowania niektórych wyrażeń regularnych, w celu zwrócenia zestawu pasujących łańcuchów. Jako takie odrzuca te re, które zawierają nieograniczone terminy powtórzeń, takie jak " + "i"*". Ale powinno dać ci wyobrażenie o tym, jak skonstruować parser, który przetwarzałby re.

 4
Author: PaulMcG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-25 12:51:18

Spróbuj tego...

//regular expression for email
    var pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    if(pattern.test(email)){
        return true;
    } else {
        return false;
    }
 -3
Author: sumit kumar pradhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-05 05:52:53