Regular Expressions
Herhaling
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.