Regular Expressions Recursion
Remarks[edit | edit source]
Recursion is mostly available in Perl-compatible flavors, such as:
Recurse into a subpattern[edit | edit source]
You can recurse into a subpattern using the following constructs (depending on the flavor), assuming
n is a capturing group number, and
name the name of a capturing group.
The following pattern:
Will match text such as:
[<<><>><>] - well balanced angle brackets within square brackets. Recursion is often used for balanced constructs matching.
Recursions are atomic (PCRE)[edit | edit source]
In PCRE, it doesn't trackback after the first match for a recursion is found. So
because after it matched
aa in the recursion, it never try again to match only
Recurse the whole pattern[edit | edit source]
(?R) is equivalent to
\g<0>) - it lets you recurse the whole pattern:
This will match properly balanced angle brackets with any text in-between the brackets, like
Subpattern definitions[edit | edit source]
) construct lets you define subpatterns you may reference later through recursion. When encountered in the pattern it will not be matched against.
This group should contain named subpattern definitions, which will be accessible only through recursion. You can define grammars this way:
(?x) # ignore pattern whitespace (?(DEFINE) (?<string> ".*?" ) (?<number> \d+ ) (?<value> \s* (?: (?&string) | (?&number) | (?&list) ) \s* ) (?<list> \[ (?&value) (?: , (?&value) )* \] ) ) ^(?&value)$
This pattern will validate text like the following:
[42, "abc", ["foo", "bar"], 10]
Note how a list can contain one or more values, and a value can itself be a list.
Relative group references[edit | edit source]
Subpatterns can be referenced with their relative group number:
(?-1)will recurse into the previous group
(?+1)will recurse into the next group
Also usable with the
Backreferences in recursions (PCRE)[edit | edit source]
In PCRE, matched groups used for backreferences before a recursion are kept in the recursion. But after the recursion they all reset to what they were before entering it. In other words, matched groups in the recursion are all forgotten.