Szukaj…


Uwagi

Rekursja jest dostępna głównie w wersjach zgodnych z Perlem, takich jak:

  • Perl
  • PCRE
  • Oniguruma
  • Podnieść

Powtórz cały wzór

Konstrukt (?R) jest równoważny z (?0) (lub \g<0> ) - pozwala powtórzyć cały wzorzec:

<(?>[^<>]+|(?R))+>

Spowoduje to dopasowanie odpowiednio wyważonych nawiasów kątowych do dowolnego tekstu między nawiasami, np. <a<b>c<d>e> .

Wróć do subpatternu

Możesz wrócić do wzorca za pomocą następujących konstrukcji (w zależności od smaku), zakładając, że n jest numerem grupy przechwytywania i name nazwę grupy przechwytywania.

  • (?n)
  • \g<n>
  • \g'0'
  • (?&name)
  • \g<name>
  • \g'name'
  • (?P>name)

Następujący wzór:

 \[(?<angle><(?&angle)*+>)*\]

Dopasuje tekst, taki jak: [<<><>><>] - dobrze wyważone nawiasy kątowe w nawiasach kwadratowych. Rekurencja jest często używana do zrównoważonych dopasowywania konstrukcji.

Definicje subpattern

Konstrukcja (?(DEFINE) ... ) pozwala definiować wzorce, do których można się później odwoływać poprzez rekurencję. Kiedy napotkał we wzorcu nie będą porównywane.

Ta grupa powinna zawierać nazwane definicje subpattern, które będą dostępne tylko poprzez rekurencję. W ten sposób możesz zdefiniować gramatykę:

(?x) # ignore pattern whitespace
(?(DEFINE)
  (?<string> ".*?" )
  (?<number> \d+ )
  (?<value>
    \s* (?:
        (?&string)
      | (?&number)
      | (?&list)
    ) \s*
  )
  (?<list> \[ (?&value) (?: , (?&value) )* \] )
)
^(?&value)$

Ten wzór sprawdzi poprawność tekstu w następujący sposób:

[42, "abc", ["foo", "bar"], 10]

Zwróć uwagę, jak lista może zawierać jedną lub więcej wartości, a sama wartość może być listą.

Względne odniesienia do grup

Wzorce pomocnicze można odnosić do ich względnego numeru grupy:

  • (?-1) powróci do poprzedniej grupy
  • (?+1) powróci do następnej grupy

Można go także używać ze składnią \g<N> .

Referencje wsteczne w rekurencjach (PCRE)

W PCRE dopasowane grupy używane dla odwołań wstecznych przed rekurencją są przechowywane w rekurencji. Ale po rekursji wszyscy resetują się do tego, czym byli przed wejściem w to. Innymi słowy, dopasowane grupy w rekursji są zapomniane.

Na przykład:

(?J)(?(DEFINE)(\g{a}(?<a>b)\g{a}))(?<a>a)\g{a}(?1)\g{a}

mecze

aaabba

Rekurencje są atomowe (PCRE)

W PCRE nie jest śledzony po znalezieniu pierwszego dopasowania dla rekurencji. Więc

(?(DEFINE)(aaa|aa|a))(?1)ab

nie pasuje

aab

bo po to dopasowane aa w rekursji, nigdy nie spróbować jeszcze raz, aby dopasować tylko . a



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow