Zoeken…


Opmerkingen

Recursie is meestal beschikbaar in Perl-compatibele smaken, zoals:

  • Perl
  • PCRE
  • Oniguruma
  • boost

Verzorg het hele patroon

Het construct (?R) is equivalent aan (?0) (of \g<0> ) - hiermee kunt u het hele patroon herverdelen:

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

Dit komt overeen met goed uitgebalanceerde haakjes met alle tekst tussen de haakjes, zoals <a<b>c<d>e> .

Verpleegster in een subpatroon

U kunt recursief in een subpatroon met de volgende constructen (afhankelijk van de smaak), uitgaande n een vastleggen groepsnummer en name de naam van een groep vastleggen.

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

Het volgende patroon:

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

Komt overeen met tekst zoals: [<<><>><>] - goed uitgebalanceerde haakjes tussen vierkante haakjes. Recursie wordt vaak gebruikt voor evenwichtige constructies die overeenkomen.

Subpatroondefinities

Met het construct (?(DEFINE) ... ) kunt u subpatronen definiëren waarnaar u later via recursie kunt verwijzen. Wanneer het in het patroon wordt aangetroffen, wordt dit niet vergeleken.

Deze groep moet de benoemde subpatroondefinities bevatten, die alleen toegankelijk zijn via recursie. U kunt grammatica's op deze manier definiëren:

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

Dit patroon valideert tekst als volgt:

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

Merk op hoe een lijst een of meer waarden kan bevatten en een waarde zelf een lijst kan zijn.

Relatieve groepsreferenties

Er kan naar subpatronen worden verwezen met hun relatieve groepsnummer:

  • (?-1) zal zich opnieuw in de vorige groep begeven
  • (?+1) gaat naar de volgende groep

Ook bruikbaar met de syntaxis \g<N> .

Terugverwijzingen in recursies (PCRE)

In PCRE worden overeenkomende groepen gebruikt voor backreferences voordat een recursie in de recursie wordt bewaard. Maar na de recursie hebben ze allemaal gereset naar wat ze waren voordat ze erin gingen. Met andere woorden: overeenkomende groepen in de recursie worden allemaal vergeten.

Bijvoorbeeld:

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

wedstrijden

aaabba

Recursies zijn atomair (PCRE)

In PCRE wordt de trackback niet gevonden nadat de eerste wedstrijd voor een recursie is gevonden. Zo

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

komt niet overeen

aab

omdat nadat het overeenkwam met aa in de recursie, het nooit meer probeert om alleen a te matchen.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow