Sök…


Anmärkningar

Rekursion finns mest i Perl-kompatibla smaker, till exempel:

  • Perl
  • PCRE
  • Oniguruma
  • Lyft

Återge hela mönstret

Konstruktionen (?R) motsvarar (?0) (eller \g<0> ) - det låter dig återanvända hela mönstret:

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

Detta kommer att matcha korrekt balanserade vinkelparenteser med alla texter mellan parenteserna, som <a<b>c<d>e> .

Återgå till en subpattern

Du kan rekrytera in i en delmönster med följande konstruktioner (beroende på smak), förutsatt att n är ett fångstgruppsnummer och name namnet på en fångargrupp.

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

Följande mönster:

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

Kommer att matcha text som: [<<><>><>] - välbalanserade vinkelfästen inom fyrkantiga parenteser. Rekursion används ofta för balanserade konstruktionsmatchning.

Definitioner av subpattern

(?(DEFINE) ... ) -konstruktionen låter dig definiera undermönster som du kan referera senare genom rekursion. När du stöter på det i mönstret kommer det inte att matchas mot.

Denna grupp bör innehålla namngivna subpattern-definitioner, som endast är tillgängliga genom rekursion. Du kan definiera grammatik på detta sätt:

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

Detta mönster validerar text på följande sätt:

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

Observera hur en lista kan innehålla ett eller flera värden, och ett värde kan i sig vara en lista.

Relativa gruppreferenser

Man kan referera till subpatterns med deras relativa gruppnummer:

  • (?-1) kommer att återgå till föregående grupp
  • (?+1) kommer att återgå till nästa grupp

Också användbar med \g<N> syntax.

Återreferenser i rekursioner (PCRE)

I PCRE hålls matchade grupper som används för backreferenser innan en rekursion i rekursionen. Men efter rekursionen återställde alla alla vad de var innan de gick in i den. Med andra ord, matchade grupper i rekursionen är alla glömda.

Till exempel:

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

tändstickor

aaabba

Rekursioner är atomära (PCRE)

I PCRE spårar det inte efter den första matchen för en rekursion. Så

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

matchar inte

aab

för efter att det matchade aa i rekursionen försöker det aldrig mer att matcha bara a .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow