| = pcre2syntax(3) | |
| :doctype: manpage | |
| :manname: pcre2syntax | |
| :manpurpose: PCRE2 syntax quick reference | |
| :manvolnum: 3 | |
| :manmanual: PCRE2 | |
| :mansource: PCRE2 10.49-DEV | |
| :docdate: 14 October 2025 | |
| :revdate: 14 October 2025 | |
| == PCRE2 regular expression syntax summary | |
| The full syntax and semantics of the regular expression patterns that are | |
| supported by PCRE2 are described in the | |
| xref:pcre2pattern.adoc[`pcre2pattern`] | |
| documentation. This document contains a quick-reference summary of the pattern | |
| syntax followed by the syntax of replacement strings in substitution function. | |
| The full description of the latter is in the | |
| xref:pcre2api.adoc[`pcre2api`] | |
| documentation. | |
| == Quoting | |
| [source,regex] | |
| .... | |
| \x where x is non-alphanumeric is a literal x | |
| \Q...\E treat enclosed characters as literal | |
| .... | |
| Note that white space inside [.regex]`\Q...\E` is always treated as literal, even if | |
| const:PCRE2_EXTENDED is set, causing most other white space to be ignored. Note also | |
| that PCRE2's handling of [.regex]`\Q...\E` has some differences from Perl's. See the | |
| xref:pcre2pattern.adoc[`pcre2pattern`] | |
| documentation for details. | |
| == Braced items | |
| With one exception, wherever brace characters [.regex]`{` and [.regex]`}` are required to enclose | |
| data for constructions such as [.regex]`\g{2}` or [.regex]`\k{name}`, space and/or horizontal tab | |
| characters that follow { or precede } are allowed and are ignored. In the case | |
| of quantifiers, they may also appear before or after the comma. The exception | |
| is [.regex]`\u{...}` which is not Perl-compatible and is recognized only when | |
| const:PCRE2_EXTRA_ALT_BSUX is set. This is an ECMAScript compatibility feature, and | |
| follows ECMAScript's behaviour. | |
| == Escaped characters | |
| This table applies to ASCII and Unicode environments. An unrecognized escape | |
| sequence causes an error. | |
| [source,regex] | |
| .... | |
| \a alarm, that is, the BEL character (hex 07) | |
| \cx "control-x", where x is a non-control ASCII character | |
| \e escape (hex 1B) | |
| \f form feed (hex 0C) | |
| \n newline (hex 0A) | |
| \r carriage return (hex 0D) | |
| \t tab (hex 09) | |
| \0dd character with octal code 0dd | |
| \ddd character with octal code ddd, or backreference | |
| \o{ddd..} character with octal code ddd.. | |
| \N{U+hh..} character with Unicode code point hh.. (Unicode mode only) | |
| \xhh character with hex code hh | |
| \x{hh..} character with hex code hh.. | |
| .... | |
| [.regex]`\N{U+hh..}` is synonymous with [.regex]`\x{hh..}` but is not supported in environments | |
| that use EBCDIC code (mainly IBM mainframes). Note that \N not followed by an | |
| opening curly bracket has a different meaning (see below). | |
| If const:PCRE2_ALT_BSUX or const:PCRE2_EXTRA_ALT_BSUX is set ("ALT_BSUX mode"), the | |
| following are also recognized: | |
| [source,regex] | |
| .... | |
| \U the character "U" | |
| \uhhhh character with hex code hhhh | |
| \u{hh..} character with hex code hh.. but only for EXTRA_ALT_BSUX | |
| .... | |
| When [.regex]`\x` is not followed by [.regex]`{`, one or two hexadecimal digits are read, | |
| but in ALT_BSUX mode [.regex]`\x` must be followed by two hexadecimal digits to be | |
| recognized as a hexadecimal escape; otherwise it matches a literal "x". | |
| Likewise, if [.regex]`\u` (in ALT_BSUX mode) is not followed by four hexadecimal digits | |
| or (in EXTRA_ALT_BSUX mode) a sequence of hex digits in curly brackets, it | |
| matches a literal "u". | |
| Note that [.regex]`\0dd` is always an octal code. The treatment of backslash followed by | |
| a non-zero digit is complicated; for details see the section | |
| "Non-printing characters" | |
| in the | |
| xref:pcre2pattern.adoc[`pcre2pattern`] | |
| documentation, where details of escape processing in EBCDIC environments are | |
| also given. | |
| == Character types | |
| [source,regex] | |
| .... | |
| . any character except newline; | |
| in dotall mode, any character whatsoever | |
| \C one code unit, even in UTF mode (best avoided) | |
| \d a decimal digit | |
| \D a character that is not a decimal digit | |
| \h a horizontal white space character | |
| \H a character that is not a horizontal white space character | |
| \N a character that is not a newline | |
| \p{_xx_} a character with the _xx_ property | |
| \P{_xx_} a character without the _xx_ property | |
| \R a newline sequence | |
| \s a white space character | |
| \S a character that is not a white space character | |
| \v a vertical white space character | |
| \V a character that is not a vertical white space character | |
| \w a "word" character | |
| \W a "non-word" character | |
| \X a Unicode extended grapheme cluster | |
| .... | |
| [.regex]`\C` is dangerous because it may leave the current matching point in the middle | |
| of a UTF-8 or UTF-16 character. The application can lock out the use of \C by | |
| setting the const:PCRE2_NEVER_BACKSLASH_C option. It is also possible to build PCRE2 | |
| with the use of [.regex]`\C` permanently disabled. | |
| By default, [.regex]`\d`, [.regex]`\s`, and [.regex]`\w` match only ASCII characters, even in UTF-8 mode | |
| or in the 16-bit and 32-bit libraries. However, if locale-specific matching is | |
| happening, \s and \w may also match characters with code points in the range | |
| 128-255. If the const:PCRE2_UCP option is set, the behaviour of these escape | |
| sequences is changed to use Unicode properties and they match many more | |
| characters, but there are some option settings that can restrict individual | |
| sequences to matching only ASCII characters. | |
| Property descriptions in [.regex]`\p` and [.regex]`\P` are matched caselessly; hyphens, | |
| underscores, and ASCII white space characters are ignored, in accordance with | |
| Unicode's "loose matching" rules. For example, [.regex]`\p{Bidi_Class=al}` is the same | |
| as [.regex]`\p{ bidi class = AL }`. | |
| == General category properties for [.regex]`\p` and [.regex]`\P` | |
| [source,regex] | |
| .... | |
| C Other | |
| Cc Control | |
| Cf Format | |
| Cn Unassigned | |
| Co Private use | |
| Cs Surrogate | |
| .... | |
| [source,regex] | |
| .... | |
| L Letter | |
| Lc Cased letter, the union of Ll, Lu, and Lt | |
| L& Synonym of Lc | |
| Ll Lower case letter | |
| Lm Modifier letter | |
| Lo Other letter | |
| Lt Title case letter | |
| Lu Upper case letter | |
| .... | |
| [source,regex] | |
| .... | |
| M Mark | |
| Mc Spacing mark | |
| Me Enclosing mark | |
| Mn Non-spacing mark | |
| .... | |
| [source,regex] | |
| .... | |
| N Number | |
| Nd Decimal number | |
| Nl Letter number | |
| No Other number | |
| .... | |
| [source,regex] | |
| .... | |
| P Punctuation | |
| Pc Connector punctuation | |
| Pd Dash punctuation | |
| Pe Close punctuation | |
| Pf Final punctuation | |
| Pi Initial punctuation | |
| Po Other punctuation | |
| Ps Open punctuation | |
| .... | |
| [source,regex] | |
| .... | |
| S Symbol | |
| Sc Currency symbol | |
| Sk Modifier symbol | |
| Sm Mathematical symbol | |
| So Other symbol | |
| .... | |
| [source,regex] | |
| .... | |
| Z Separator | |
| Zl Line separator | |
| Zp Paragraph separator | |
| Zs Space separator | |
| .... | |
| From release 10.45, when caseless matching is set, Ll, Lu, and Lt are all | |
| equivalent to Lc. | |
| == PCRE2 special category properties for [.regex]`\p` and [.regex]`\P` | |
| [source,regex] | |
| .... | |
| Xan Alphanumeric: union of properties L and N | |
| Xps POSIX space: property Z or tab, NL, VT, FF, CR | |
| Xsp Perl space: property Z or tab, NL, VT, FF, CR | |
| Xuc Universally-named character: one that can be | |
| represented by a Universal Character Name | |
| Xwd Perl word: property Xan or underscore | |
| .... | |
| Perl and POSIX space are now the same. Perl added VT to its space character set | |
| at release 5.18. | |
| == Binary properties for [.regex]`\p` and [.regex]`\P` | |
| Unicode defines a number of binary properties, that is, properties whose only | |
| values are true or false. You can obtain a list of those that are recognized by | |
| [.regex]`\p` and [.regex]`\P`, along with their abbreviations, by running this command: | |
| [source,text] | |
| .... | |
| pcre2test -LP | |
| .... | |
| == Script matching with [.regex]`\p` and [.regex]`\P` | |
| Many script names and their 4-letter abbreviations are recognized in | |
| [.regex]`\p{sc:...}` or [.regex]`\p{scx:...}` items, or on their own with [.regex]`\p` (and also [.regex]`\P` of | |
| course). You can obtain a list of these scripts by running this command: | |
| [source,text] | |
| .... | |
| pcre2test -LS | |
| .... | |
| == The Bidi_Class property for [.regex]`\p` and [.regex]`\P` | |
| [source,regex] | |
| .... | |
| \p{Bidi_Class:<class>} matches a character with the given class | |
| \p{BC:<class>} matches a character with the given class | |
| .... | |
| The recognized classes are: | |
| [source,regex] | |
| .... | |
| AL Arabic letter | |
| AN Arabic number | |
| B paragraph separator | |
| BN boundary neutral | |
| CS common separator | |
| EN European number | |
| ES European separator | |
| ET European terminator | |
| FSI first strong isolate | |
| L left-to-right | |
| LRE left-to-right embedding | |
| LRI left-to-right isolate | |
| LRO left-to-right override | |
| NSM non-spacing mark | |
| ON other neutral | |
| PDF pop directional format | |
| PDI pop directional isolate | |
| R right-to-left | |
| RLE right-to-left embedding | |
| RLI right-to-left isolate | |
| RLO right-to-left override | |
| S segment separator | |
| WS white space | |
| .... | |
| == Character classes | |
| [source,regex] | |
| .... | |
| [...] positive character class | |
| [^...] negative character class | |
| [x-y] range (can be used for hex characters) | |
| [[:xxx:]] positive POSIX named set | |
| [[:^xxx:]] negative POSIX named set | |
| .... | |
| [source,regex] | |
| .... | |
| alnum alphanumeric | |
| alpha alphabetic | |
| ascii 0-127 | |
| blank space or tab | |
| cntrl control character | |
| digit decimal digit | |
| graph printing, excluding space | |
| lower lower case letter | |
| print printing, including space | |
| punct printing, excluding alphanumeric | |
| space white space | |
| upper upper case letter | |
| word same as \w | |
| xdigit hexadecimal digit | |
| .... | |
| In PCRE2, POSIX character set names recognize only ASCII characters by default, | |
| but some of them use Unicode properties if const:PCRE2_UCP is set. You can use | |
| [.regex]`\Q...\E` inside a character class. | |
| When const:PCRE2_ALT_EXTENDED_CLASS is set, UTS#18 extended character classes may be | |
| used, allowing nested character classes, combined using set operators. | |
| [source,regex] | |
| .... | |
| [x&&[^y]] UTS#18 extended character class | |
| .... | |
| [source,regex] | |
| .... | |
| x||y set union (OR) | |
| x&&y set intersection (AND) | |
| x--y set difference (AND NOT) | |
| x~~y set symmetric difference (XOR) | |
| .... | |
| == Perl extended character classes | |
| [source,regex] | |
| .... | |
| (?[...]) Perl extended character class | |
| (?[\p{Thai} & \p{Nd}]) operators; white space ignored | |
| (?[(x - y) & z]) parentheses for grouping | |
| .... | |
| [source,regex] | |
| .... | |
| (?[ [^3] & \p{Nd} ]) [...] is a nested ordinary class | |
| (?[ [:alpha:] - [z] ]) POSIX set is allowed outside [...] | |
| (?[ \d - [3] ]) backslash-escaped set is allowed outside [...] | |
| (?[ !\n & [:ascii:] ]) backslash-escaped character is allowed outside [...] | |
| all other characters or ranges must be enclosed in [...] | |
| .... | |
| [source,regex] | |
| .... | |
| x|y, x+y set union (OR) | |
| x&y set intersection (AND) | |
| x-y set difference (AND NOT) | |
| x^y set symmetric difference (XOR) | |
| !x set complement (NOT) | |
| .... | |
| Inside a Perl extended character class, [...] switches mode to be interpreted | |
| as an ordinary character class. Outside of a nested [...], the only items | |
| permitted are backslash-escapes, POSIX sets, operators, and parentheses. Inside | |
| a nested ordinary class, ^ has its usual meaning (inverts the class when used | |
| as the first character); outside of a nested class, ^ is the XOR operator. | |
| == Quantifiers | |
| [source,regex] | |
| .... | |
| ? 0 or 1, greedy | |
| ?+ 0 or 1, possessive | |
| ?? 0 or 1, lazy | |
| * 0 or more, greedy | |
| *+ 0 or more, possessive | |
| *? 0 or more, lazy | |
| + 1 or more, greedy | |
| ++ 1 or more, possessive | |
| +? 1 or more, lazy | |
| {n} exactly n | |
| {n,m} at least n, no more than m, greedy | |
| {n,m}+ at least n, no more than m, possessive | |
| {n,m}? at least n, no more than m, lazy | |
| {n,} n or more, greedy | |
| {n,}+ n or more, possessive | |
| {n,}? n or more, lazy | |
| {,m} zero up to m, greedy | |
| {,m}+ zero up to m, possessive | |
| {,m}? zero up to m, lazy | |
| .... | |
| == Anchors and simple assertions | |
| [source,regex] | |
| .... | |
| \b word boundary | |
| \B not a word boundary | |
| ^ start of subject | |
| also after an internal newline in multiline mode | |
| (after any newline if PCRE2_ALT_CIRCUMFLEX is set) | |
| \A start of subject | |
| $ end of subject | |
| also before newline at end of subject | |
| also before internal newline in multiline mode | |
| \Z end of subject | |
| also before newline at end of subject | |
| \z end of subject | |
| \G first matching position in subject | |
| .... | |
| == Reported match point setting | |
| [source,regex] | |
| .... | |
| \K set reported start of match | |
| .... | |
| From release 10.38 \K is not permitted by default in lookaround assertions, | |
| for compatibility with Perl. However, if the const:PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK | |
| option is set, the previous behaviour is re-enabled. When this option is set, | |
| \K is honoured in positive assertions, but ignored in negative ones. | |
| == Alternation | |
| [source,regex] | |
| .... | |
| expr|expr|expr... | |
| .... | |
| == Capturing | |
| [source,regex] | |
| .... | |
| (...) capture group | |
| (?<name>...) named capture group (Perl) | |
| (?'name'...) named capture group (Perl) | |
| (?P<name>...) named capture group (Python) | |
| (?:...) non-capture group | |
| (?|...) non-capture group; reset group numbers for | |
| capture groups in each alternative | |
| .... | |
| In non-UTF modes, names may contain underscores and ASCII letters and digits; | |
| in UTF modes, any Unicode letters and Unicode decimal digits are permitted. In | |
| both cases, a name must not start with a digit. | |
| == Atomic groups | |
| [source,regex] | |
| .... | |
| (?>...) atomic non-capture group | |
| (*atomic:...) atomic non-capture group | |
| .... | |
| == Comment | |
| [source,regex] | |
| .... | |
| (?#....) comment (not nestable) | |
| .... | |
| == Option setting | |
| Changes of these options within a group are automatically cancelled at the end | |
| of the group. | |
| [source,regex] | |
| .... | |
| (?a) all ASCII options | |
| (?aD) restrict \d to ASCII in UCP mode | |
| (?aS) restrict \s to ASCII in UCP mode | |
| (?aW) restrict \w to ASCII in UCP mode | |
| (?aP) restrict all POSIX classes to ASCII in UCP mode | |
| (?aT) restrict POSIX digit classes to ASCII in UCP mode | |
| (?i) caseless | |
| (?J) allow duplicate named groups | |
| (?m) multiline | |
| (?n) no auto capture | |
| (?r) restrict caseless to either ASCII or non-ASCII | |
| (?s) single line (dotall) | |
| (?U) default ungreedy (lazy) | |
| (?x) ignore white space except in classes or \Q...\E | |
| (?xx) as (?x) but also ignore space and tab in classes | |
| (?-...) unset the given option(s) | |
| (?^) unset imnrsx options | |
| .... | |
| (?aP) implies (?aT) as well, though this has no additional effect. However, it | |
| means that (?-aP) also implies (?-aT) and disables all ASCII restrictions for | |
| POSIX classes. | |
| Unsetting x or xx unsets both. Several options may be set at once, and a | |
| mixture of setting and unsetting such as (?i-x) is allowed, but there may be | |
| only one hyphen. Setting (but no unsetting) is allowed after (?^ for example | |
| (?^in). An option setting may appear at the start of a non-capture group, for | |
| example (?i:...). | |
| The following are recognized only at the very start of a pattern or after one | |
| of the newline or \R sequences or options with similar syntax. More than one | |
| of them may appear. For the first three, d is a decimal number. | |
| [source,regex] | |
| .... | |
| (*LIMIT_DEPTH=d) set the backtracking limit to d | |
| (*LIMIT_HEAP=d) set the heap size limit to d * 1024 bytes | |
| (*LIMIT_MATCH=d) set the match limit to d | |
| (*CASELESS_RESTRICT) set PCRE2_EXTRA_CASELESS_RESTRICT when matching | |
| (*NOTEMPTY) set PCRE2_NOTEMPTY when matching | |
| (*NOTEMPTY_ATSTART) set PCRE2_NOTEMPTY_ATSTART when matching | |
| (*NO_AUTO_POSSESS) no auto-possessification (PCRE2_NO_AUTO_POSSESS) | |
| (*NO_DOTSTAR_ANCHOR) no .* anchoring (PCRE2_NO_DOTSTAR_ANCHOR) | |
| (*NO_JIT) disable JIT optimization | |
| (*NO_START_OPT) no start-match optimization (PCRE2_NO_START_OPTIMIZE) | |
| (*TURKISH_CASING) set PCRE2_EXTRA_TURKISH_CASING when matching | |
| (*UTF) set appropriate UTF mode for the library in use | |
| (*UCP) set PCRE2_UCP (use Unicode properties for \d etc) | |
| .... | |
| Note that LIMIT_DEPTH, LIMIT_HEAP, and LIMIT_MATCH can only reduce the value of | |
| the limits set by the caller of func:pcre2_match() or func:pcre2_dfa_match(), | |
| not increase them. LIMIT_RECURSION is an obsolete synonym for LIMIT_DEPTH. The | |
| application can lock out the use of [.regex]`(*UTF)` and [.regex]`(*UCP)` by setting the | |
| const:PCRE2_NEVER_UTF or const:PCRE2_NEVER_UCP options, respectively, at compile time. | |
| == Newline convention | |
| These are recognized only at the very start of the pattern or after option | |
| settings with a similar syntax. | |
| [source,regex] | |
| .... | |
| (*CR) carriage return only | |
| (*LF) linefeed only | |
| (*CRLF) carriage return followed by linefeed | |
| (*ANYCRLF) all three of the above | |
| (*ANY) any Unicode newline sequence | |
| (*NUL) the NUL character (binary zero) | |
| .... | |
| == What \R matches | |
| These are recognized only at the very start of the pattern or after option | |
| setting with a similar syntax. | |
| [source,regex] | |
| .... | |
| (*BSR_ANYCRLF) CR, LF, or CRLF | |
| (*BSR_UNICODE) any Unicode newline sequence | |
| .... | |
| == Lookahead and lookbehind assertions | |
| [source,regex] | |
| .... | |
| (?=...) ) | |
| (*pla:...) ) positive lookahead | |
| (*positive_lookahead:...) ) | |
| .... | |
| [source,regex] | |
| .... | |
| (?!...) ) | |
| (*nla:...) ) negative lookahead | |
| (*negative_lookahead:...) ) | |
| .... | |
| [source,regex] | |
| .... | |
| (?<=...) ) | |
| (*plb:...) ) positive lookbehind | |
| (*positive_lookbehind:...) ) | |
| .... | |
| [source,regex] | |
| .... | |
| (?<!...) ) | |
| (*nlb:...) ) negative lookbehind | |
| (*negative_lookbehind:...) ) | |
| .... | |
| Each top-level branch of a lookbehind must have a limit for the number of | |
| characters it matches. If any branch can match a variable number of characters, | |
| the maximum for each branch is limited to a value set by the caller of | |
| func:pcre2_compile() or defaulted. The default is set when PCRE2 is built | |
| (ultimate default 255). If every branch matches a fixed number of characters, | |
| the limit for each branch is 65535 characters. | |
| == Non-atomic lookaround assertions | |
| These assertions are specific to PCRE2 and are not Perl-compatible. | |
| [source,regex] | |
| .... | |
| (?*...) ) | |
| (*napla:...) ) synonyms | |
| (*non_atomic_positive_lookahead:...) ) | |
| .... | |
| [source,regex] | |
| .... | |
| (?<*...) ) | |
| (*naplb:...) ) synonyms | |
| (*non_atomic_positive_lookbehind:...) ) | |
| .... | |
| == Substring scan assertion | |
| This feature is not Perl-compatible. | |
| [source,regex] | |
| .... | |
| (*scan_substring:(grouplist)...) scan captured substring | |
| (*scs:(grouplist)...) scan captured substring | |
| .... | |
| The comma-separated list "grouplist" may identify groups in any of the | |
| following ways: | |
| [source,text] | |
| .... | |
| n absolute reference | |
| +n relative reference | |
| -n relative reference | |
| <name> name | |
| 'name' name | |
| .... | |
| == Script runs | |
| [source,regex] | |
| .... | |
| (*script_run:...) ) script run, can be backtracked into | |
| (*sr:...) ) | |
| .... | |
| [source,regex] | |
| .... | |
| (*atomic_script_run:...) ) atomic script run | |
| (*asr:...) ) | |
| .... | |
| == Backreferences | |
| [source,regex] | |
| .... | |
| \n reference by number (can be ambiguous) | |
| \gn reference by number | |
| \g{n} reference by number | |
| \g+n relative reference by number (PCRE2 extension) | |
| \g-n relative reference by number | |
| \g{+n} relative reference by number (PCRE2 extension) | |
| \g{-n} relative reference by number | |
| \k<name> reference by name (Perl) | |
| \k'name' reference by name (Perl) | |
| \g{name} reference by name (Perl) | |
| \k{name} reference by name (.NET) | |
| (?P=name) reference by name (Python) | |
| .... | |
| == Subroutine references (possibly recursive) | |
| [source,regex] | |
| .... | |
| (?R) recurse whole pattern | |
| (?n) call subroutine by absolute number | |
| (?+n) call subroutine by relative number | |
| (?-n) call subroutine by relative number | |
| (?&name) call subroutine by name (Perl) | |
| (?P>name) call subroutine by name (Python) | |
| \g<name> call subroutine by name (Oniguruma) | |
| \g'name' call subroutine by name (Oniguruma) | |
| \g<n> call subroutine by absolute number (Oniguruma) | |
| \g'n' call subroutine by absolute number (Oniguruma) | |
| \g<+n> call subroutine by relative number (PCRE2 extension) | |
| \g'+n' call subroutine by relative number (PCRE2 extension) | |
| \g<-n> call subroutine by relative number (PCRE2 extension) | |
| \g'-n' call subroutine by relative number (PCRE2 extension) | |
| .... | |
| The variants using parentheses (?...) may also specify a list of capture groups | |
| to return, which shall be retained in the calling subexpression if set during | |
| the recursion (this feature is not supported by Perl). | |
| [source,regex] | |
| .... | |
| (?R(grouplist)) recurse whole pattern, returning capture groups | |
| (PCRE2 extension) | |
| (?n(grouplist)) ) | |
| (?+n(grouplist)) ) call subroutine, returning capture groups | |
| (?-n(grouplist)) ) (PCRE2 extension) | |
| (?&name(grouplist)) ) | |
| (?P>name(grouplist)) ) | |
| .... | |
| The comma-separated list "grouplist" uses the same syntax as | |
| [.regex]`(*scan_substring:(grouplist)...)`, and may identify groups in any of the | |
| following ways: | |
| [source,text] | |
| .... | |
| n absolute reference | |
| +n relative reference | |
| -n relative reference | |
| <name> name | |
| 'name' name | |
| .... | |
| == Conditional patterns | |
| [source,regex] | |
| .... | |
| (?(condition)yes-pattern) | |
| (?(condition)yes-pattern|no-pattern) | |
| .... | |
| [source,regex] | |
| .... | |
| (?(n) absolute reference condition | |
| (?(+n) relative reference condition (PCRE2 extension) | |
| (?(-n) relative reference condition (PCRE2 extension) | |
| (?(<name>) named reference condition (Perl) | |
| (?('name') named reference condition (Perl) | |
| (?(name) named reference condition (PCRE2, deprecated) | |
| (?(R) overall recursion condition | |
| (?(Rn) specific numbered group recursion condition | |
| (?(R&name) specific named group recursion condition | |
| (?(DEFINE) define groups for reference | |
| (?(VERSION[>]=n[.m]) test PCRE2 version | |
| (?(assert) assertion condition | |
| .... | |
| Note the ambiguity of (?(R) and (?(Rn) which might be named reference | |
| conditions or recursion tests. Such a condition is interpreted as a reference | |
| condition if the relevant named group exists. | |
| The parts within brackets for the VERSION conditional syntax could be ommited. | |
| The fractional part of the version number defaults to 0 in that case. | |
| == Backtracking control | |
| All backtracking control verbs may be in the form [.regex]`(*VERB:NAME)`. For [.regex]`(*MARK)` the | |
| name is mandatory, for the others it is optional. [.regex]`(*SKIP)` changes its behaviour | |
| if :NAME is present. The others just set a name for passing back to the caller, | |
| but this is not a name that [.regex]`(*SKIP)` can see. The following act immediately they | |
| are reached: | |
| [source,regex] | |
| .... | |
| (*ACCEPT) force successful match | |
| (*FAIL) force backtrack; synonym (*F) | |
| (*MARK:NAME) set name to be passed back; synonym (*:NAME) | |
| .... | |
| The following act only when a subsequent match failure causes a backtrack to | |
| reach them. They all force a match failure, but they differ in what happens | |
| afterwards. Those that advance the start-of-match point do so only if the | |
| pattern is not anchored. | |
| [source,regex] | |
| .... | |
| (*COMMIT) overall failure, no advance of starting point | |
| (*PRUNE) advance to next starting character | |
| (*SKIP) advance to current matching position | |
| (*SKIP:NAME) advance to position corresponding to an earlier | |
| (*MARK:NAME); if not found, the (*SKIP) is ignored | |
| (*THEN) local failure, backtrack to next alternation | |
| .... | |
| The effect of one of these verbs in a group called as a subroutine is confined | |
| to the subroutine call. | |
| == Callouts | |
| [source,regex] | |
| .... | |
| (?C) callout (assumed number 0) | |
| (?Cn) callout with numerical data n | |
| (?C"text") callout with string data | |
| .... | |
| The allowed string delimiters are ` ' " ^ % # $ (which are the same for the | |
| start and the end), and the starting delimiter { matched with the ending | |
| delimiter }. To encode the ending delimiter within the string, double it. | |
| == Replacement strings | |
| If the const:PCRE2_SUBSTITUTE_LITERAL option is set, a replacement string for | |
| func:pcre2_substitute() is not interpreted. Otherwise, by default, the only | |
| special character is the dollar character in one of the following forms: | |
| [source,text] | |
| .... | |
| $$ insert a dollar character | |
| $n or ${n} insert the contents of group _n_ | |
| $<name> insert the contents of named group | |
| $0 or $& insert the entire matched substring | |
| $` insert the substring that precedes the match | |
| $' insert the substring that follows the match | |
| $_ insert the entire input string | |
| $+ insert the highest-numbered capture group which matched | |
| $*MARK or ${*MARK} insert a control verb name | |
| .... | |
| For ${n}, n can be a name or a number. If const:PCRE2_SUBSTITUTE_EXTENDED is set, | |
| there is additional interpretation: | |
| . Backslash is an escape character, and the forms described in "ESCAPED | |
| CHARACTERS" above are recognized. Also: | |
| [source,text] | |
| .... | |
| \Q...\E can be used to suppress interpretation | |
| \l force the next character to lower case | |
| \u force the next character to upper case | |
| \L force subsequent characters to lower case | |
| \U force subsequent characters to upper case | |
| \u\L force next character to upper case, then all lower | |
| \l\U force next character to lower case, then all upper | |
| \E end \L or \U case forcing | |
| \b backspace character (note: as in character class in pattern) | |
| \v vertical tab character (note: not the same as in a pattern) | |
| .... | |
| . The Python form \g<n>, where the angle brackets are part of the syntax and | |
| _n_ is either a group name or a number, is recognized as an alternative way | |
| of inserting the contents of a group, for example \g<3>. | |
| . Capture substitution supports the following additional forms: | |
| [source,text] | |
| .... | |
| ${n:-string} default for unset group | |
| ${n:+string1:string2} values for set/unset group | |
| .... | |
| The substitution strings themselves are expanded. Backslash can be used to | |
| escape colons and closing curly brackets. | |
| == See also | |
| `pcre2pattern`(3), `pcre2api`(3), `pcre2callout`(3), | |
| `pcre2matching`(3), `pcre2`(3). | |
| == Author | |
| [literal] | |
| ---- | |
| Philip Hazel | |
| Retired from University Computing Service | |
| Cambridge, England. | |
| ---- | |
| == Revision | |
| Last updated: 14 October 2025 + | |
| Copyright (c) 1997-2024 University of Cambridge. |