| <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="Asciidoctor 2.0.26"><meta name="description" content="Syntax quick-reference summary"><title>pcre2syntax(3)</title><link rel="stylesheet" href="./css/document.css"><link rel="stylesheet" href="./css/standalone.css"><meta name="color-scheme" content="light dark"><meta name="theme-color" media="(prefers-color-scheme: light)" content="#0085cc"><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#33b8ff"></head><body class="manpage toc2 toc-right offline-manual"><header class="offline-nav"><nav><a class="offline-index" href="./index.html">Index</a><a class="offline-home" href="https://www.pcre2.org/"><span aria-hidden="true">🌐︎</span> PCRE2 homepage</a></nav></header><main class="document-page"><header class="document-title"><h1>pcre2syntax(3)</h1><p class="document-meta">PCRE2 10.50-DEV manual; updated <time datetime="2025-10-14">14 Oct 2025</time></p></header><div class="document-layout"><nav id="toc" class="toc2" role="doc-toc"><h2 id="toc-title">Contents</h2><ol class="toc-list level-1"><li><a href="#_pcre2_regular_expression_syntax_summary" title="PCRE2 regular expression syntax summary">PCRE2 regular expression syntax summary</a></li><li><a href="#_quoting" title="Quoting">Quoting</a></li><li><a href="#_braced_items" title="Braced items">Braced items</a></li><li><a href="#_escaped_characters" title="Escaped characters">Escaped characters</a></li><li><a href="#_character_types" title="Character types">Character types</a></li><li><a href="#_general_category_properties_for_p_and_p" title="General category properties for \p and \P">General category properties for <code class="regex rouge"><span class="pcre2-semantic">\p</span></code> and <code class="regex rouge"><span class="pcre2-semantic">\P</span></code></a></li><li><a href="#_pcre2_special_category_properties_for_p_and_p" title="PCRE2 special category properties for \p and \P">PCRE2 special category properties for <code class="regex rouge"><span class="pcre2-semantic">\p</span></code> and <code class="regex rouge"><span class="pcre2-semantic">\P</span></code></a></li><li><a href="#_binary_properties_for_p_and_p" title="Binary properties for \p and \P">Binary properties for <code class="regex rouge"><span class="pcre2-semantic">\p</span></code> and <code class="regex rouge"><span class="pcre2-semantic">\P</span></code></a></li><li><a href="#_script_matching_with_p_and_p" title="Script matching with \p and \P">Script matching with <code class="regex rouge"><span class="pcre2-semantic">\p</span></code> and <code class="regex rouge"><span class="pcre2-semantic">\P</span></code></a></li><li><a href="#_the_bidi_class_property_for_p_and_p" title="The Bidi_Class property for \p and \P">The <code class="regex rouge"><span class="pcre2-semantic">Bidi_Class</span></code> property for <code class="regex rouge"><span class="pcre2-semantic">\p</span></code> and <code class="regex rouge"><span class="pcre2-semantic">\P</span></code></a></li><li><a href="#_character_classes" title="Character classes">Character classes</a></li><li><a href="#_perl_extended_character_classes" title="Perl extended character classes">Perl extended character classes</a></li><li><a href="#_quantifiers" title="Quantifiers">Quantifiers</a></li><li><a href="#_anchors_and_simple_assertions" title="Anchors and simple assertions">Anchors and simple assertions</a></li><li><a href="#_reported_match_point_setting" title="Reported match point setting">Reported match point setting</a></li><li><a href="#_alternation" title="Alternation">Alternation</a></li><li><a href="#_capturing" title="Capturing">Capturing</a></li><li><a href="#_atomic_groups" title="Atomic groups">Atomic groups</a></li><li><a href="#_comment" title="Comment">Comment</a></li><li><a href="#_option_setting" title="Option setting">Option setting</a></li><li><a href="#_newline_convention" title="Newline convention">Newline convention</a></li><li><a href="#_what_r_matches" title="What \R matches">What <code class="regex rouge"><span class="pcre2-semantic">\R</span></code> matches</a></li><li><a href="#_lookahead_and_lookbehind_assertions" title="Lookahead and lookbehind assertions">Lookahead and lookbehind assertions</a></li><li><a href="#_non_atomic_lookaround_assertions" title="Non-atomic lookaround assertions">Non-atomic lookaround assertions</a></li><li><a href="#_substring_scan_assertion" title="Substring scan assertion">Substring scan assertion</a></li><li><a href="#_script_runs" title="Script runs">Script runs</a></li><li><a href="#_backreferences" title="Backreferences">Backreferences</a></li><li><a href="#_subroutine_references_possibly_recursive" title="Subroutine references (possibly recursive)">Subroutine references (possibly recursive)</a></li><li><a href="#_conditional_patterns" title="Conditional patterns">Conditional patterns</a></li><li><a href="#_backtracking_control" title="Backtracking control">Backtracking control</a></li><li><a href="#_callouts" title="Callouts">Callouts</a></li><li><a href="#_replacement_strings" title="Replacement strings">Replacement strings</a></li><li><a href="#_see_also" title="See also">See also</a></li></ol></nav><article class="prose" id="content"><section class="doc-section level-1"><h2 id="_pcre2_regular_expression_syntax_summary">PCRE2 regular expression syntax summary</h2><p>The full syntax and semantics of the regular expression patterns that are | |
| supported by PCRE2 are described in the | |
| <a href="./pcre2pattern.html"><code>pcre2pattern</code></a> | |
| 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 | |
| <a href="./pcre2api.html"><code>pcre2api</code></a> | |
| documentation.</p></section> | |
| <section class="doc-section level-1"><h2 id="_quoting">Quoting</h2><dl class="compact" style="--tab-width: 6"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\<em>x</em></span></code></span></dt><dd>where <em>x</em> is non-alphanumeric, matches a literal <em>x</em></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\Q...\E</span></code></span></dt><dd>treat enclosed characters as literal</dd></div></dl> | |
| <p>Note that white space inside <code class="regex rouge"><span class="pcre2-semantic">\Q...\E</span></code> is always treated as literal, even if | |
| <code class="constant pcre2-api rouge"><span class="no">PCRE2_EXTENDED</span></code> is set, causing most other white space to be ignored. Note also | |
| that PCRE2’s handling of <code class="regex rouge"><span class="pcre2-semantic">\Q...\E</span></code> has some differences from Perl’s. See the | |
| <a href="./pcre2pattern.html"><code>pcre2pattern</code></a> | |
| documentation for details.</p></section> | |
| <section class="doc-section level-1"><h2 id="_braced_items">Braced items</h2><p>With one exception, wherever brace characters <code class="regex rouge"><span class="pcre2-semantic">{</span></code> and <code class="regex rouge"><span class="pcre2-semantic">}</span></code> are required to enclose | |
| data for constructions such as <code class="regex rouge"><span class="pcre2-semantic">\g{2}</span></code> or <code class="regex rouge"><span class="pcre2-semantic">\k{name}</span></code>, space and/or horizontal tab | |
| characters that follow <code class="regex rouge"><span class="pcre2-semantic">{</span></code> or precede <code class="regex rouge"><span class="pcre2-semantic">}</span></code> are allowed and are ignored. In the case | |
| of quantifiers, they may also appear before or after the comma. The exception | |
| is <code class="regex rouge"><span class="pcre2-semantic">\u{...}</span></code> which is not Perl-compatible and is recognized only when | |
| <code class="constant pcre2-api rouge"><span class="no">PCRE2_EXTRA_ALT_BSUX</span></code> is set. This is an ECMAScript compatibility feature, and | |
| follows ECMAScript’s behaviour.</p></section> | |
| <section class="doc-section level-1"><h2 id="_escaped_characters">Escaped characters</h2><p>This table applies to ASCII and Unicode environments. An unrecognized escape | |
| sequence causes an error.</p> | |
| <dl class="compact" style="--tab-width: 12"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\a</span></code> </span></dt><dd>alarm, that is, the BEL character (<span class="character-info" title="" tabindex="0" aria-describedby="pcre2-character-1"><code class="character pcre2-api rouge"><span class="sc">0x07</span></code><span class="character-card" id="pcre2-character-1" role="tooltip" aria-label="ALERT (U+0007)" aria-hidden="true" data-pagefind-ignore=""><span class="character-glyph" data-character=""></span><span class="character-name" data-character-name="ALERT"></span><span class="character-codepoint" data-codepoint="U+0007"></span></span></span>)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\c<em>x</em></span></code> </span></dt><dd>"control-<em>x</em>", where <em>x</em> is a non-control ASCII character</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\e</span></code> </span></dt><dd>escape (<span class="character-info" title="" tabindex="0" aria-describedby="pcre2-character-2"><code class="character pcre2-api rouge"><span class="sc">0x1B</span></code><span class="character-card" id="pcre2-character-2" role="tooltip" aria-label="ESCAPE (U+001B)" aria-hidden="true" data-pagefind-ignore=""><span class="character-glyph" data-character=""></span><span class="character-name" data-character-name="ESCAPE"></span><span class="character-codepoint" data-codepoint="U+001B"></span></span></span>)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\f</span></code> </span></dt><dd>form feed (<span class="character-info" title="" tabindex="0" aria-describedby="pcre2-character-3"><code class="character pcre2-api rouge"><span class="sc">0x0C</span></code><span class="character-card" id="pcre2-character-3" role="tooltip" aria-label="FORM FEED (U+000C)" aria-hidden="true" data-pagefind-ignore=""><span class="character-glyph" data-character=""></span><span class="character-name" data-character-name="FORM FEED"></span><span class="character-codepoint" data-codepoint="U+000C"></span></span></span>)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\n</span></code> </span></dt><dd>newline (<span class="character-info" title="" tabindex="0" aria-describedby="pcre2-character-4"><code class="character pcre2-api rouge"><span class="sc">0x0A</span></code><span class="character-card" id="pcre2-character-4" role="tooltip" aria-label="LINE FEED (U+000A)" aria-hidden="true" data-pagefind-ignore=""><span class="character-glyph" data-character=""></span><span class="character-name" data-character-name="LINE FEED"></span><span class="character-codepoint" data-codepoint="U+000A"></span></span></span>)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\r</span></code> </span></dt><dd>carriage return (<span class="character-info" title="" tabindex="0" aria-describedby="pcre2-character-5"><code class="character pcre2-api rouge"><span class="sc">0x0D</span></code><span class="character-card" id="pcre2-character-5" role="tooltip" aria-label="CARRIAGE RETURN (U+000D)" aria-hidden="true" data-pagefind-ignore=""><span class="character-glyph" data-character=""></span><span class="character-name" data-character-name="CARRIAGE RETURN"></span><span class="character-codepoint" data-codepoint="U+000D"></span></span></span>)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\t</span></code> </span></dt><dd>tab (<span class="character-info" title="" tabindex="0" aria-describedby="pcre2-character-6"><code class="character pcre2-api rouge"><span class="sc">0x09</span></code><span class="character-card" id="pcre2-character-6" role="tooltip" aria-label="CHARACTER TABULATION (U+0009)" aria-hidden="true" data-pagefind-ignore=""><span class="character-glyph" data-character=""></span><span class="character-name" data-character-name="CHARACTER TABULATION"></span><span class="character-codepoint" data-codepoint="U+0009"></span></span></span>)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\0<em>dd</em></span></code> </span></dt><dd>character with octal code 0<em>dd</em></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\<em>ddd</em></span></code> </span></dt><dd>character with octal code <em>ddd</em>, or backreference</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\o{<em>ddd...</em>}</span></code> </span></dt><dd>character with octal code <em>ddd...</em></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\N{U+<em>hh...</em>}</span></code> </span></dt><dd>character with Unicode code point <em>hh...</em> (Unicode mode only)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\x<em>hh</em></span></code> </span></dt><dd>character with hex code <em>hh</em></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\x{<em>hh...</em>}</span></code> </span></dt><dd>character with hex code <em>hh...</em></dd></div></dl> | |
| <p><code class="regex rouge"><span class="pcre2-semantic">\N{U+<em>hh...</em>}</span></code> is synonymous with <code class="regex rouge"><span class="pcre2-semantic">\x{<em>hh...</em>}</span></code> but is not supported in environments | |
| that use EBCDIC code (mainly IBM mainframes). Note that <code class="regex rouge"><span class="pcre2-semantic">\N</span></code> not followed by an | |
| opening curly bracket has a different meaning (see below).</p> | |
| <p>If <code class="constant pcre2-api rouge"><span class="no">PCRE2_ALT_BSUX</span></code> or <code class="constant pcre2-api rouge"><span class="no">PCRE2_EXTRA_ALT_BSUX</span></code> is set ("ALT_BSUX mode"), the | |
| following are also recognized:</p> | |
| <dl class="compact" style="--tab-width: 8"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\U</span></code> </span></dt><dd>the character "U"</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\u<em>hhhh</em></span></code> </span></dt><dd>character with hex code <em>hhhh</em></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\u{<em>hh...</em>}</span></code> </span></dt><dd>character with hex code <em>hh...</em> but only for EXTRA_ALT_BSUX</dd></div></dl> | |
| <p>When <code class="regex rouge"><span class="pcre2-semantic">\x</span></code> is not followed by <code class="regex rouge"><span class="pcre2-semantic">{</span></code>, one or two hexadecimal digits are read, | |
| but in ALT_BSUX mode <code class="regex rouge"><span class="pcre2-semantic">\x</span></code> must be followed by two hexadecimal digits to be | |
| recognized as a hexadecimal escape; otherwise it matches a literal <code class="subject rouge"><span class="pcre2-semantic">x</span></code>. | |
| Likewise, if <code class="regex rouge"><span class="pcre2-semantic">\u</span></code> (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 <code class="subject rouge"><span class="pcre2-semantic">u</span></code>.</p> | |
| <p>Note that <code class="regex rouge"><span class="pcre2-semantic">\0<em>dd</em></span></code> is always an octal code. The treatment of backslash followed by | |
| a non-zero digit is complicated; for details see the section | |
| <a href="./pcre2pattern.html#non-printing-characters">Non-printing characters</a> | |
| in the | |
| <a href="./pcre2pattern.html"><code>pcre2pattern</code></a> | |
| documentation, where details of escape processing in EBCDIC environments are | |
| also given.</p></section> | |
| <section class="doc-section level-1"><h2 id="_character_types">Character types</h2><dl class="compact" style="--tab-width: 6"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">.</span></code> </span></dt><dd>any character except newline; in dotall mode, any character whatsoever</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\C</span></code> </span></dt><dd>one code unit, even in UTF mode (best avoided)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\d</span></code> </span></dt><dd>a decimal digit</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\D</span></code> </span></dt><dd>a character that is not a decimal digit</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\h</span></code> </span></dt><dd>a horizontal white space character</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\H</span></code> </span></dt><dd>a character that is not a horizontal white space character</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\N</span></code> </span></dt><dd>a character that is not a newline</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\p{<em>xx</em>}</span></code> </span></dt><dd>a character with the <em>xx</em> property</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\P{<em>xx</em>}</span></code> </span></dt><dd>a character without the <em>xx</em> property</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\R</span></code> </span></dt><dd>a newline sequence</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\s</span></code> </span></dt><dd>a white space character</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\S</span></code> </span></dt><dd>a character that is not a white space character</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\v</span></code> </span></dt><dd>a vertical white space character</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\V</span></code> </span></dt><dd>a character that is not a vertical white space character</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\w</span></code> </span></dt><dd>a "word" character</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\W</span></code> </span></dt><dd>a "non-word" character</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\X</span></code> </span></dt><dd>a Unicode extended grapheme cluster</dd></div></dl> | |
| <p><code class="regex rouge"><span class="pcre2-semantic">\C</span></code> 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 <code class="regex rouge"><span class="pcre2-semantic">\C</span></code> by | |
| setting the <code class="constant pcre2-api rouge"><span class="no">PCRE2_NEVER_BACKSLASH_C</span></code> option. It is also possible to build PCRE2 | |
| with the use of <code class="regex rouge"><span class="pcre2-semantic">\C</span></code> permanently disabled.</p> | |
| <p>By default, <code class="regex rouge"><span class="pcre2-semantic">\d</span></code>, <code class="regex rouge"><span class="pcre2-semantic">\s</span></code>, and <code class="regex rouge"><span class="pcre2-semantic">\w</span></code> 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, <code class="regex rouge"><span class="pcre2-semantic">\s</span></code> and <code class="regex rouge"><span class="pcre2-semantic">\w</span></code> may also match characters with code points in the range | |
| 128–255. If the <code class="constant pcre2-api rouge"><span class="no">PCRE2_UCP</span></code> 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.</p> | |
| <p>Property descriptions in <code class="regex rouge"><span class="pcre2-semantic">\p</span></code> and <code class="regex rouge"><span class="pcre2-semantic">\P</span></code> are matched caselessly; hyphens, | |
| underscores, and ASCII white space characters are ignored, in accordance with | |
| Unicode’s "loose matching" rules. For example, <code class="regex rouge"><span class="pcre2-semantic">\p{Bidi_Class=al}</span></code> is the same | |
| as <code class="regex rouge"><span class="pcre2-semantic">\p{ bidi class = AL }</span></code>.</p></section> | |
| <section class="doc-section level-1"><h2 id="_general_category_properties_for_p_and_p">General category properties for <code class="regex rouge"><span class="pcre2-semantic">\p</span></code> and <code class="regex rouge"><span class="pcre2-semantic">\P</span></code></h2><dl class="compact" style="--tab-width: 4"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">C</span></code></span></dt><dd>Other</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Cc</span></code></span></dt><dd>Control</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Cf</span></code></span></dt><dd>Format</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Cn</span></code></span></dt><dd>Unassigned</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Co</span></code></span></dt><dd>Private use</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Cs</span></code></span></dt><dd>Surrogate</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">L</span></code></span></dt><dd>Letter</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Lc</span></code></span></dt><dd>Cased letter, the union of <code class="regex rouge"><span class="pcre2-semantic">Ll</span></code>, <code class="regex rouge"><span class="pcre2-semantic">Lu</span></code>, and <code class="regex rouge"><span class="pcre2-semantic">Lt</span></code></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">L&</span></code></span></dt><dd>Synonym of <code class="regex rouge"><span class="pcre2-semantic">Lc</span></code></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Ll</span></code></span></dt><dd>Lower case letter</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Lm</span></code></span></dt><dd>Modifier letter</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Lo</span></code></span></dt><dd>Other letter</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Lt</span></code></span></dt><dd>Title case letter</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Lu</span></code></span></dt><dd>Upper case letter</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">M</span></code></span></dt><dd>Mark</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Mc</span></code></span></dt><dd>Spacing mark</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Me</span></code></span></dt><dd>Enclosing mark</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Mn</span></code></span></dt><dd>Non-spacing mark</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">N</span></code></span></dt><dd>Number</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Nd</span></code></span></dt><dd>Decimal number</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Nl</span></code></span></dt><dd>Letter number</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">No</span></code></span></dt><dd>Other number</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">P</span></code></span></dt><dd>Punctuation</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Pc</span></code></span></dt><dd>Connector punctuation</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Pd</span></code></span></dt><dd>Dash punctuation</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Pe</span></code></span></dt><dd>Close punctuation</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Pf</span></code></span></dt><dd>Final punctuation</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Pi</span></code></span></dt><dd>Initial punctuation</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Po</span></code></span></dt><dd>Other punctuation</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Ps</span></code></span></dt><dd>Open punctuation</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">S</span></code></span></dt><dd>Symbol</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Sc</span></code></span></dt><dd>Currency symbol</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Sk</span></code></span></dt><dd>Modifier symbol</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Sm</span></code></span></dt><dd>Mathematical symbol</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">So</span></code></span></dt><dd>Other symbol</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Z</span></code></span></dt><dd>Separator</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Zl</span></code></span></dt><dd>Line separator</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Zp</span></code></span></dt><dd>Paragraph separator</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Zs</span></code></span></dt><dd>Space separator</dd></div></dl> | |
| <p>From release 10.45, when caseless matching is set, <code class="regex rouge"><span class="pcre2-semantic">Ll</span></code>, <code class="regex rouge"><span class="pcre2-semantic">Lu</span></code>, and | |
| <code class="regex rouge"><span class="pcre2-semantic">Lt</span></code> are all equivalent to <code class="regex rouge"><span class="pcre2-semantic">Lc</span></code>.</p></section> | |
| <section class="doc-section level-1"><h2 id="_pcre2_special_category_properties_for_p_and_p">PCRE2 special category properties for <code class="regex rouge"><span class="pcre2-semantic">\p</span></code> and <code class="regex rouge"><span class="pcre2-semantic">\P</span></code></h2><dl class="compact" style="--tab-width: 4"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Xan</span></code></span></dt><dd>Alphanumeric: union of properties <code class="regex rouge"><span class="pcre2-semantic">L</span></code> and <code class="regex rouge"><span class="pcre2-semantic">N</span></code></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Xps</span></code></span></dt><dd>POSIX space: property <code class="regex rouge"><span class="pcre2-semantic">Z</span></code> or tab, NL, VT, FF, CR</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Xsp</span></code></span></dt><dd>Perl space: property <code class="regex rouge"><span class="pcre2-semantic">Z</span></code> or tab, NL, VT, FF, CR</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Xuc</span></code></span></dt><dd>Universally-named character: one that can be represented by a | |
| Universal Character Name</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">Xwd</span></code></span></dt><dd>Perl word: property <code class="regex rouge"><span class="pcre2-semantic">Xan</span></code> or underscore</dd></div></dl> | |
| <p>Perl and POSIX space are now the same. Perl added VT to its space character set | |
| at release 5.18.</p></section> | |
| <section class="doc-section level-1"><h2 id="_binary_properties_for_p_and_p">Binary properties for <code class="regex rouge"><span class="pcre2-semantic">\p</span></code> and <code class="regex rouge"><span class="pcre2-semantic">\P</span></code></h2><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 | |
| <code class="regex rouge"><span class="pcre2-semantic">\p</span></code> and <code class="regex rouge"><span class="pcre2-semantic">\P</span></code>, along with their abbreviations, by running this command:</p> | |
| <div class="listing-block"><pre class="rouge highlight"><code data-lang="shell">pcre2test <span class="nt">-LP</span></code></pre></div></section> | |
| <section class="doc-section level-1"><h2 id="_script_matching_with_p_and_p">Script matching with <code class="regex rouge"><span class="pcre2-semantic">\p</span></code> and <code class="regex rouge"><span class="pcre2-semantic">\P</span></code></h2><p>Many script names and their 4-letter abbreviations are recognized in | |
| <code class="regex rouge"><span class="pcre2-semantic">\p{sc:...}</span></code> or <code class="regex rouge"><span class="pcre2-semantic">\p{scx:...}</span></code> items, or on their own with <code class="regex rouge"><span class="pcre2-semantic">\p</span></code> (and also <code class="regex rouge"><span class="pcre2-semantic">\P</span></code> of | |
| course). You can obtain a list of these scripts by running this command:</p> | |
| <div class="listing-block"><pre class="rouge highlight"><code data-lang="shell">pcre2test <span class="nt">-LS</span></code></pre></div></section> | |
| <section class="doc-section level-1"><h2 id="_the_bidi_class_property_for_p_and_p">The <code class="regex rouge"><span class="pcre2-semantic">Bidi_Class</span></code> property for <code class="regex rouge"><span class="pcre2-semantic">\p</span></code> and <code class="regex rouge"><span class="pcre2-semantic">\P</span></code></h2><dl class="compact" style="--tab-width: 12"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\p{Bidi_Class:<em>class</em>}</span></code></span></dt><dd>Matches a character with the given class</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\p{BC:<em>class</em>}</span></code></span></dt><dd>Matches a character with the given class</dd></div></dl> | |
| <p>The recognized classes are:</p> | |
| <dl class="compact" style="--tab-width: 4"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">AL</span></code></span></dt><dd>Arabic letter</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">AN</span></code></span></dt><dd>Arabic number</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">B</span></code></span></dt><dd>Paragraph separator</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">BN</span></code></span></dt><dd>Boundary neutral</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">CS</span></code></span></dt><dd>Common separator</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">EN</span></code></span></dt><dd>European number</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">ES</span></code></span></dt><dd>European separator</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">ET</span></code></span></dt><dd>European terminator</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">FSI</span></code></span></dt><dd>First strong isolate</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">L</span></code></span></dt><dd>Left-to-right</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">LRE</span></code></span></dt><dd>Left-to-right embedding</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">LRI</span></code></span></dt><dd>Left-to-right isolate</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">LRO</span></code></span></dt><dd>Left-to-right override</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">NSM</span></code></span></dt><dd>Non-spacing mark</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">ON</span></code></span></dt><dd>Other neutral</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">PDF</span></code></span></dt><dd>Pop directional format</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">PDI</span></code></span></dt><dd>Pop directional isolate</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">R</span></code></span></dt><dd>Right-to-left</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">RLE</span></code></span></dt><dd>Right-to-left embedding</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">RLI</span></code></span></dt><dd>Right-to-left isolate</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">RLO</span></code></span></dt><dd>Right-to-left override</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">S</span></code></span></dt><dd>Segment separator</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">WS</span></code></span></dt><dd>White space</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_character_classes">Character classes</h2><dl class="compact" style="--tab-width: 6"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">[...]</span></code></span></dt><dd>Positive character class</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">[^...]</span></code></span></dt><dd>Negative character class</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">[x-y]</span></code></span></dt><dd>Range (can be used for hexadecimal characters)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">[[:<em>xxx</em>:]]</span></code></span></dt><dd>Positive POSIX named set</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">[[:^<em>xxx</em>:]]</span></code></span></dt><dd>Negative POSIX named set</dd></div></dl> | |
| <p>The recognized POSIX named sets are:</p> | |
| <dl class="compact" style="--tab-width: 4"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">alnum</span></code></span></dt><dd>Alphanumeric</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">alpha</span></code></span></dt><dd>Alphabetic</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">ascii</span></code></span></dt><dd>0–127</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">blank</span></code></span></dt><dd>Space or tab</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">cntrl</span></code></span></dt><dd>Control character</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">digit</span></code></span></dt><dd>Decimal digit</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">graph</span></code></span></dt><dd>Printing, excluding space</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">lower</span></code></span></dt><dd>Lower case letter</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">print</span></code></span></dt><dd>Printing, including space</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">punct</span></code></span></dt><dd>Printing, excluding alphanumeric</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">space</span></code></span></dt><dd>White space</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">upper</span></code></span></dt><dd>Upper case letter</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">word</span></code></span></dt><dd>Same as <code class="regex rouge"><span class="pcre2-semantic">\w</span></code></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">xdigit</span></code></span></dt><dd>Hexadecimal digit</dd></div></dl> | |
| <p>In PCRE2, POSIX character set names recognize only ASCII characters by default, | |
| but some of them use Unicode properties if <code class="constant pcre2-api rouge"><span class="no">PCRE2_UCP</span></code> is set. You can use | |
| <code class="regex rouge"><span class="pcre2-semantic">\Q...\E</span></code> inside a character class.</p> | |
| <p>When <code class="constant pcre2-api rouge"><span class="no">PCRE2_ALT_EXTENDED_CLASS</span></code> is set, UTS#18 extended character classes may be | |
| used, allowing nested character classes, combined using set operators.</p> | |
| <dl class="compact" style="--tab-width: 10"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">[x&&[^y]]</span></code></span></dt><dd>UTS#18 extended character class</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">x||y</span></code></span></dt><dd>Set union (OR)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">x&&y</span></code></span></dt><dd>Set intersection (AND)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">x--y</span></code></span></dt><dd>Set difference (AND NOT)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">x~~y</span></code></span></dt><dd>Set symmetric difference (XOR)</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_perl_extended_character_classes">Perl extended character classes</h2><dl class="compact" style="--tab-width: 14"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?[...])</span></code></span></dt><dd>Perl extended character class</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?[\p{Thai} & \p{Nd}])</span></code></span></dt><dd>Operators; white space ignored</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?[(<em>X</em> - <em>Y</em>) & <em>Z</em>])</span></code></span></dt><dd>Parentheses for grouping</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?[ [^3] & \p{Nd} ])</span></code></span></dt><dd><code class="regex rouge"><span class="pcre2-semantic">[ ... ]</span></code> is a nested ordinary class</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?[ [:alpha:] - [z] ])</span></code></span></dt><dd>POSIX set is allowed outside <code class="regex rouge"><span class="pcre2-semantic">[ ... ]</span></code> but character literal must be enclosed</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?[ \d - [3] ])</span></code></span></dt><dd>Backslash-escaped set is allowed outside <code class="regex rouge"><span class="pcre2-semantic">[ ... ]</span></code></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?[ !\n & [:ascii:] ])</span></code></span></dt><dd>Backslash-escaped character is allowed outside | |
| <code class="regex rouge"><span class="pcre2-semantic">[ ... ]</span></code>; all other characters or ranges must be enclosed in <code class="regex rouge"><span class="pcre2-semantic">[ ... ]</span></code></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">x|y</span></code>, <code class="regex rouge"><span class="pcre2-semantic">x+y</span></code></span></dt><dd>Set union (OR)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">x&y</span></code></span></dt><dd>Set intersection (AND)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">x-y</span></code></span></dt><dd>Set difference (AND NOT)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">x^y</span></code></span></dt><dd>Set symmetric difference (XOR)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">!x</span></code></span></dt><dd>Set complement (NOT)</dd></div></dl> | |
| <p>Inside a Perl extended character class, <code class="regex rouge"><span class="pcre2-semantic">[...]</span></code> switches mode to be interpreted | |
| as an ordinary character class. Outside of a nested <code class="regex rouge"><span class="pcre2-semantic">[...]</span></code>, the only items | |
| permitted are backslash-escapes, POSIX sets, operators, and parentheses. Inside | |
| a nested ordinary class, <code class="regex rouge"><span class="pcre2-semantic">^</span></code> has its usual meaning (inverts the class when used | |
| as the first character); outside of a nested class, <code class="regex rouge"><span class="pcre2-semantic">^</span></code> is the XOR operator.</p></section> | |
| <section class="doc-section level-1"><h2 id="_quantifiers">Quantifiers</h2><dl class="compact" style="--tab-width: 4"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">?</span></code></span></dt><dd>0 or 1, greedy</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">?+</span></code></span></dt><dd>0 or 1, possessive</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">??</span></code></span></dt><dd>0 or 1, lazy</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">*</span></code></span></dt><dd>0 or more, greedy</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">*+</span></code></span></dt><dd>0 or more, possessive</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">*?</span></code></span></dt><dd>0 or more, lazy</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">+</span></code></span></dt><dd>1 or more, greedy</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">++</span></code></span></dt><dd>1 or more, possessive</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">+?</span></code></span></dt><dd>1 or more, lazy</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">{<em>n</em>}</span></code></span></dt><dd>Exactly <em>n</em></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">{<em>n</em>,<em>m</em>}</span></code></span></dt><dd>At least <em>n</em>, no more than <em>m</em>, greedy</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">{<em>n</em>,<em>m</em>}+</span></code></span></dt><dd>At least <em>n</em>, no more than <em>m</em>, possessive</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">{<em>n</em>,<em>m</em>}?</span></code></span></dt><dd>At least <em>n</em>, no more than <em>m</em>, lazy</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">{<em>n</em>,}</span></code></span></dt><dd><em>n</em> or more, greedy</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">{<em>n</em>,}+</span></code></span></dt><dd><em>n</em> or more, possessive</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">{<em>n</em>,}?</span></code></span></dt><dd><em>n</em> or more, lazy</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">{,<em>m</em>}</span></code></span></dt><dd>Zero up to <em>m</em>, greedy</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">{,<em>m</em>}+</span></code></span></dt><dd>Zero up to <em>m</em>, possessive</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">{,<em>m</em>}?</span></code></span></dt><dd>Zero up to <em>m</em>, lazy</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_anchors_and_simple_assertions">Anchors and simple assertions</h2><dl class="compact" style="--tab-width: 4"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\b</span></code></span></dt><dd>Word boundary</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\B</span></code></span></dt><dd>Not a word boundary</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">^</span></code></span></dt><dd>Start of subject; also after an internal newline in multiline mode | |
| (after any newline if <code class="constant pcre2-api rouge"><span class="no">PCRE2_ALT_CIRCUMFLEX</span></code> is set)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\A</span></code></span></dt><dd>Start of subject</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">$</span></code></span></dt><dd>End of subject; also before newline at end of subject and before | |
| an internal newline in multiline mode</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\Z</span></code></span></dt><dd>End of subject; also before newline at end of subject</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\z</span></code></span></dt><dd>End of subject</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\G</span></code></span></dt><dd>First matching position in subject</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_reported_match_point_setting">Reported match point setting</h2><dl class="compact" style="--tab-width: 4"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\K</span></code></span></dt><dd>Set reported start of match</dd></div></dl> | |
| <p>From release 10.38, <code class="regex rouge"><span class="pcre2-semantic">\K</span></code> is not permitted by default in lookaround assertions, | |
| for compatibility with Perl. However, if the <code class="constant pcre2-api rouge"><span class="no">PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK</span></code> | |
| option is set, the previous behaviour is re-enabled. When this option is set, | |
| <code class="regex rouge"><span class="pcre2-semantic">\K</span></code> is honoured in positive assertions, but ignored in negative ones.</p></section> | |
| <section class="doc-section level-1"><h2 id="_alternation">Alternation</h2><dl class="compact" style="--tab-width: 10"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic"><em>expr</em>|<em>expr</em>|<em>expr</em>...</span></code></span></dt><dd>Alternative expressions</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_capturing">Capturing</h2><dl class="compact" style="--tab-width: 12"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(...)</span></code></span></dt><dd>Capture group</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?<<em>name</em>>...)</span></code></span></dt><dd>Named capture group (Perl)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?'<em>name</em>'...)</span></code></span></dt><dd>Named capture group (Perl)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?P<<em>name</em>>...)</span></code></span></dt><dd>Named capture group (Python)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?:...)</span></code></span></dt><dd>Non-capture group</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?|...)</span></code></span></dt><dd>Non-capture group; reset group numbers for capture groups | |
| in each alternative</dd></div></dl> | |
| <p>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.</p></section> | |
| <section class="doc-section level-1"><h2 id="_atomic_groups">Atomic groups</h2><dl class="compact" style="--tab-width: 8"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?>...)</span></code></span></dt><dd>Atomic non-capture group</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*atomic:...)</span></code></span></dt><dd>Atomic non-capture group</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_comment">Comment</h2><dl class="compact" style="--tab-width: 6"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?#...)</span></code></span></dt><dd>Comment (not nestable)</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_option_setting">Option setting</h2><p>Changes of these options within a group are automatically cancelled at the end | |
| of the group.</p> | |
| <dl class="compact" style="--tab-width: 6"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?a)</span></code></span></dt><dd>All ASCII options</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?aD)</span></code></span></dt><dd>Restrict <code class="regex rouge"><span class="pcre2-semantic">\d</span></code> to ASCII in UCP mode</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?aS)</span></code></span></dt><dd>Restrict <code class="regex rouge"><span class="pcre2-semantic">\s</span></code> to ASCII in UCP mode</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?aW)</span></code></span></dt><dd>Restrict <code class="regex rouge"><span class="pcre2-semantic">\w</span></code> to ASCII in UCP mode</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?aP)</span></code></span></dt><dd>Restrict all POSIX classes to ASCII in UCP mode</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?aT)</span></code></span></dt><dd>Restrict POSIX digit classes to ASCII in UCP mode</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?i)</span></code></span></dt><dd>Caseless</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?J)</span></code></span></dt><dd>Allow duplicate named groups</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?m)</span></code></span></dt><dd>Multiline</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?n)</span></code></span></dt><dd>No auto capture</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?r)</span></code></span></dt><dd>Restrict caseless to either ASCII or non-ASCII</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?s)</span></code></span></dt><dd>Single line (dotall)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?U)</span></code></span></dt><dd>Default ungreedy (lazy)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?x)</span></code></span></dt><dd>Ignore white space except in classes or <code class="regex rouge"><span class="pcre2-semantic">\Q...\E</span></code></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?xx)</span></code></span></dt><dd>As <code class="regex rouge"><span class="pcre2-semantic">(?x)</span></code>, but also ignore space and tab in classes</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?-...)</span></code></span></dt><dd>Unset the given option(s)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?^)</span></code></span></dt><dd>Unset <code class="regex rouge"><span class="pcre2-semantic">imnrsx</span></code> options</dd></div></dl> | |
| <p><code class="regex rouge"><span class="pcre2-semantic">(?aP)</span></code> implies <code class="regex rouge"><span class="pcre2-semantic">(?aT)</span></code> as well, though this has no additional effect. However, it | |
| means that <code class="regex rouge"><span class="pcre2-semantic">(?-aP)</span></code> also implies <code class="regex rouge"><span class="pcre2-semantic">(?-aT)</span></code> and disables all ASCII restrictions for | |
| POSIX classes.</p> | |
| <p>Unsetting <code class="regex rouge"><span class="pcre2-semantic">x</span></code> or <code class="regex rouge"><span class="pcre2-semantic">xx</span></code> unsets both. Several options may be set at once, and a | |
| mixture of setting and unsetting such as <code class="regex rouge"><span class="pcre2-semantic">(?i-x)</span></code> is allowed, but there may be | |
| only one hyphen. Setting (but no unsetting) is allowed after <code class="regex rouge"><span class="pcre2-semantic">(?^</span></code>, for example | |
| <code class="regex rouge"><span class="pcre2-semantic">(?^in)</span></code>. An option setting may appear at the start of a non-capture group, for | |
| example <code class="regex rouge"><span class="pcre2-semantic">(?i:...)</span></code>.</p> | |
| <p>The following are recognized only at the very start of a pattern or after one | |
| of the newline or <code class="regex rouge"><span class="pcre2-semantic">\R</span></code> sequences or options with similar syntax. More than one | |
| of them may appear. For the first three, d is a decimal number.</p> | |
| <dl class="compact" style="--tab-width: 12"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*LIMIT_DEPTH=<em>d</em>)</span></code></span></dt><dd>Set the backtracking limit to <em>d</em></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*LIMIT_HEAP=<em>d</em>)</span></code></span></dt><dd>Set the heap size limit to <em>d</em> * 1024 bytes</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*LIMIT_MATCH=<em>d</em>)</span></code></span></dt><dd>Set the match limit to <em>d</em></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*CASELESS_RESTRICT)</span></code></span></dt><dd>Set <code class="constant pcre2-api rouge"><span class="no">PCRE2_EXTRA_CASELESS_RESTRICT</span></code> when matching</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*NOTEMPTY)</span></code></span></dt><dd>Set <code class="constant pcre2-api rouge"><span class="no">PCRE2_NOTEMPTY</span></code> when matching</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*NOTEMPTY_ATSTART)</span></code></span></dt><dd>Set <code class="constant pcre2-api rouge"><span class="no">PCRE2_NOTEMPTY_ATSTART</span></code> when matching</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*NO_AUTO_POSSESS)</span></code></span></dt><dd>No auto-possessification | |
| (<code class="constant pcre2-api rouge"><span class="no">PCRE2_NO_AUTO_POSSESS</span></code>)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*NO_DOTSTAR_ANCHOR)</span></code></span></dt><dd>No <code class="regex rouge"><span class="pcre2-semantic">.*</span></code> anchoring | |
| (<code class="constant pcre2-api rouge"><span class="no">PCRE2_NO_DOTSTAR_ANCHOR</span></code>)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*NO_JIT)</span></code></span></dt><dd>Disable JIT optimization</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*NO_START_OPT)</span></code></span></dt><dd>No start-match optimization | |
| (<code class="constant pcre2-api rouge"><span class="no">PCRE2_NO_START_OPTIMIZE</span></code>)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*TURKISH_CASING)</span></code></span></dt><dd>Set <code class="constant pcre2-api rouge"><span class="no">PCRE2_EXTRA_TURKISH_CASING</span></code> when matching</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*UTF)</span></code></span></dt><dd>Set appropriate UTF mode for the library in use</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*UCP)</span></code></span></dt><dd>Set <code class="constant pcre2-api rouge"><span class="no">PCRE2_UCP</span></code> (use Unicode properties for <code class="regex rouge"><span class="pcre2-semantic">\d</span></code>, etc.)</dd></div></dl> | |
| <p>Note that <code class="regex rouge"><span class="pcre2-semantic">LIMIT_DEPTH</span></code>, <code class="regex rouge"><span class="pcre2-semantic">LIMIT_HEAP</span></code>, and <code class="regex rouge"><span class="pcre2-semantic">LIMIT_MATCH</span></code> can only reduce the value of | |
| the limits set by the caller of <code class="function pcre2-api rouge"><span class="nf">pcre2_match()</span></code> or <code class="function pcre2-api rouge"><span class="nf">pcre2_dfa_match()</span></code>, | |
| not increase them. <code class="regex rouge"><span class="pcre2-semantic">LIMIT_RECURSION</span></code> is an obsolete synonym for <code class="regex rouge"><span class="pcre2-semantic">LIMIT_DEPTH</span></code>. The | |
| application can lock out the use of <code class="regex rouge"><span class="pcre2-semantic">(*UTF)</span></code> and <code class="regex rouge"><span class="pcre2-semantic">(*UCP)</span></code> by setting the | |
| <code class="constant pcre2-api rouge"><span class="no">PCRE2_NEVER_UTF</span></code> or <code class="constant pcre2-api rouge"><span class="no">PCRE2_NEVER_UCP</span></code> options, respectively, at compile time.</p></section> | |
| <section class="doc-section level-1"><h2 id="_newline_convention">Newline convention</h2><p>These are recognized only at the very start of the pattern or after option | |
| settings with a similar syntax.</p> | |
| <dl class="compact" style="--tab-width: 6"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*CR)</span></code></span></dt><dd>Carriage return only</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*LF)</span></code></span></dt><dd>Linefeed only</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*CRLF)</span></code></span></dt><dd>Carriage return followed by linefeed</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*ANYCRLF)</span></code></span></dt><dd>All three of the above</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*ANY)</span></code></span></dt><dd>Any Unicode newline sequence</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*NUL)</span></code></span></dt><dd>The NUL character (binary zero)</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_what_r_matches">What <code class="regex rouge"><span class="pcre2-semantic">\R</span></code> matches</h2><p>These are recognized only at the very start of the pattern or after option | |
| setting with a similar syntax.</p> | |
| <dl class="compact" style="--tab-width: 8"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*BSR_ANYCRLF)</span></code></span></dt><dd>CR, LF, or CRLF</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*BSR_UNICODE)</span></code></span></dt><dd>Any Unicode newline sequence</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_lookahead_and_lookbehind_assertions">Lookahead and lookbehind assertions</h2><dl class="spaced" style="--tab-width: 14"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?=...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*pla:...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*positive_lookahead:...)</span></code></span></dt><dd>Positive lookahead</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?!...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*nla:...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*negative_lookahead:...)</span></code></span></dt><dd>Negative lookahead</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?<=...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*plb:...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*positive_lookbehind:...)</span></code></span></dt><dd>Positive lookbehind</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?<!...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*nlb:...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*negative_lookbehind:...)</span></code></span></dt><dd>Negative lookbehind</dd></div></dl> | |
| <p>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 | |
| <code class="function pcre2-api rouge"><span class="nf">pcre2_compile()</span></code> 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 65,535 characters.</p></section> | |
| <section class="doc-section level-1"><h2 id="_non_atomic_lookaround_assertions">Non-atomic lookaround assertions</h2><p>These assertions are specific to PCRE2 and are not Perl-compatible.</p> | |
| <dl class="spaced" style="--tab-width: 8"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?*...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*napla:...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*non_atomic_positive_lookahead:...)</span></code></span></dt><dd>Synonyms for non-atomic | |
| positive lookahead</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?<*...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*naplb:...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*non_atomic_positive_lookbehind:...)</span></code></span></dt><dd>Synonyms for non-atomic | |
| positive lookbehind</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_substring_scan_assertion">Substring scan assertion</h2><p>This feature is not Perl-compatible.</p> | |
| <dl class="compact" style="--tab-width: 4"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*scan_substring:(<em>grouplist</em>)...)</span></code></span></dt><dd>Scan captured substring</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*scs:(<em>grouplist</em>)...)</span></code></span></dt><dd>Scan captured substring</dd></div></dl> | |
| <p>The comma-separated list <em>grouplist</em> may identify groups in any of the | |
| following ways:</p> | |
| <dl class="compact" style="--tab-width: 8"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic"><em>n</em></span></code></span></dt><dd>Absolute reference</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">+<em>n</em></span></code></span></dt><dd>Relative reference</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">-<em>n</em></span></code></span></dt><dd>Relative reference</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic"><<em>name</em>></span></code></span></dt><dd>Name</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">'<em>name</em>'</span></code></span></dt><dd>Name</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_script_runs">Script runs</h2><dl class="spaced" style="--tab-width: 14"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*script_run:...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*sr:...)</span></code></span></dt><dd>Script run; can be | |
| backtracked into</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*atomic_script_run:...)</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(*asr:...)</span></code></span></dt><dd>Atomic script run</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_backreferences">Backreferences</h2><dl class="compact" style="--tab-width: 8"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\<em>n</em></span></code></span></dt><dd>Reference by number (can be ambiguous)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g<em>n</em></span></code></span></dt><dd>Reference by number</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g{<em>n</em>}</span></code></span></dt><dd>Reference by number</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g+<em>n</em></span></code></span></dt><dd>Relative reference by number (PCRE2 extension)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g-<em>n</em></span></code></span></dt><dd>Relative reference by number</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g{+<em>n</em>}</span></code></span></dt><dd>Relative reference by number (PCRE2 extension)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g{-<em>n</em>}</span></code></span></dt><dd>Relative reference by number</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\k<<em>name</em>></span></code></span></dt><dd>Reference by name (Perl)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\k'<em>name</em>'</span></code></span></dt><dd>Reference by name (Perl)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g{<em>name</em>}</span></code></span></dt><dd>Reference by name (Perl)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\k{<em>name</em>}</span></code></span></dt><dd>Reference by name (.NET)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?P=<em>name</em>)</span></code></span></dt><dd>Reference by name (Python)</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_subroutine_references_possibly_recursive">Subroutine references (possibly recursive)</h2><dl class="compact" style="--tab-width: 8"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?R)</span></code></span></dt><dd>Recurse whole pattern</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?<em>n</em>)</span></code></span></dt><dd>Call subroutine by absolute number</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?+<em>n</em>)</span></code></span></dt><dd>Call subroutine by relative number</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?-<em>n</em>)</span></code></span></dt><dd>Call subroutine by relative number</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?&<em>name</em>)</span></code></span></dt><dd>Call subroutine by name (Perl)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?P><em>name</em>)</span></code></span></dt><dd>Call subroutine by name (Python)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g<<em>name</em>></span></code></span></dt><dd>Call subroutine by name (Oniguruma)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g'<em>name</em>'</span></code></span></dt><dd>Call subroutine by name (Oniguruma)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g<<em>n</em>></span></code></span></dt><dd>Call subroutine by absolute number (Oniguruma)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g'<em>n</em>'</span></code></span></dt><dd>Call subroutine by absolute number (Oniguruma)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g<+<em>n</em>></span></code></span></dt><dd>Call subroutine by relative number (PCRE2 extension)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g'+<em>n</em>'</span></code></span></dt><dd>Call subroutine by relative number (PCRE2 extension)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g<-<em>n</em>></span></code></span></dt><dd>Call subroutine by relative number (PCRE2 extension)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">\g'-<em>n</em>'</span></code></span></dt><dd>Call subroutine by relative number (PCRE2 extension)</dd></div></dl> | |
| <p>The variants using parentheses <code class="regex rouge"><span class="pcre2-semantic">(?...)</span></code> 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).</p> | |
| <dl class="spaced" style="--tab-width: 14"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?R(<em>grouplist</em>))</span></code></span></dt><dd>Recurse whole pattern, returning capture groups | |
| (PCRE2 extension)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?<em>n</em>(<em>grouplist</em>))</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(?+<em>n</em>(<em>grouplist</em>))</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(?-<em>n</em>(<em>grouplist</em>))</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(?&<em>name</em>(<em>grouplist</em>))</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(?P><em>name</em>(<em>grouplist</em>))</span></code></span></dt><dd>Call subroutine, returning capture groups | |
| (PCRE2 extension)</dd></div></dl> | |
| <p>The comma-separated list <em>grouplist</em> uses the same syntax as | |
| <code class="regex rouge"><span class="pcre2-semantic">(*scan_substring:(<em>grouplist</em>)...)</span></code>, and may identify groups in any of the | |
| following ways:</p> | |
| <dl class="compact" style="--tab-width: 8"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic"><em>n</em></span></code></span></dt><dd>Absolute reference</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">+<em>n</em></span></code></span></dt><dd>Relative reference</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">-<em>n</em></span></code></span></dt><dd>Relative reference</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic"><<em>name</em>></span></code></span></dt><dd>Name</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">'<em>name</em>'</span></code></span></dt><dd>Name</dd></div></dl></section> | |
| <section class="doc-section level-1"><h2 id="_conditional_patterns">Conditional patterns</h2><dl class="compact" style="--tab-width: 4"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?(<em>condition</em>)<em>yes-pattern</em>)</span></code></span></dt><dd>Conditional pattern without an alternative</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?(<em>condition</em>)<em>yes-pattern</em>|<em>no-pattern</em>)</span></code></span></dt><dd>Conditional pattern with an alternative</dd></div></dl> | |
| <p>The forms for the <em>condition</em> are:</p> | |
| <dl class="compact" style="--tab-width: 14"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?(<em>n</em>)</span></code></span></dt><dd>Absolute reference condition</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?(+<em>n</em>)</span></code></span></dt><dd>Relative reference condition (PCRE2 extension)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?(-<em>n</em>)</span></code></span></dt><dd>Relative reference condition (PCRE2 extension)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?(<<em>name</em>>)</span></code></span></dt><dd>Named reference condition (Perl)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?('<em>name</em>')</span></code></span></dt><dd>Named reference condition (Perl)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?(<em>name</em>)</span></code></span></dt><dd>Named reference condition (PCRE2, deprecated)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?(R)</span></code></span></dt><dd>Overall recursion condition</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?(R<em>n</em>)</span></code></span></dt><dd>Specific numbered group recursion condition</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?(R&<em>name</em>)</span></code></span></dt><dd>Specific named group recursion condition</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?(DEFINE)</span></code></span></dt><dd>Define groups for reference</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?(VERSION<em>[</em>><em>]</em>=<em>n</em><em>[</em>.<em>m</em><em>]</em>)</span></code></span></dt><dd>Test PCRE2 version</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?(<em>assert</em>)</span></code></span></dt><dd>Assertion condition</dd></div></dl> | |
| <p>Note the ambiguity of <code class="regex rouge"><span class="pcre2-semantic">(?(R)</span></code> and <code class="regex rouge"><span class="pcre2-semantic">(?(R<em>n</em>)</span></code> which might be named reference | |
| conditions or recursion tests. Such a condition is interpreted as a reference | |
| condition if the relevant named group exists.</p> | |
| <p>The parts within brackets for the VERSION conditional syntax can be ommited. | |
| The fractional part of the version number defaults to 0 in that case.</p></section> | |
| <section class="doc-section level-1"><h2 id="_backtracking_control">Backtracking control</h2><p>All backtracking control verbs may be in the form <code class="regex rouge"><span class="pcre2-semantic">(*VERB:<em>NAME</em>)</span></code>. For <code class="regex rouge"><span class="pcre2-semantic">(*MARK)</span></code> the | |
| name is mandatory, for the others it is optional. <code class="regex rouge"><span class="pcre2-semantic">(*SKIP)</span></code> changes its behaviour | |
| if <code class="regex rouge"><span class="pcre2-semantic">:<em>NAME</em></span></code> is present. The others just set a name for passing back to the caller, | |
| but this is not a name that <code class="regex rouge"><span class="pcre2-semantic">(*SKIP)</span></code> can see. The following act immediately they | |
| are reached:</p> | |
| <dl class="compact" style="--tab-width: 8"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*ACCEPT)</span></code></span></dt><dd>Force successful match</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*FAIL)</span></code></span></dt><dd>Force backtrack; synonym <code class="regex rouge"><span class="pcre2-semantic">(*F)</span></code></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*MARK:<em>NAME</em>)</span></code></span></dt><dd>Set name to be passed back; synonym <code class="regex rouge"><span class="pcre2-semantic">(*:<em>NAME</em>)</span></code></dd></div></dl> | |
| <p>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.</p> | |
| <dl class="compact" style="--tab-width: 8"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*COMMIT)</span></code></span></dt><dd>Overall failure, no advance of starting point</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*PRUNE)</span></code></span></dt><dd>Advance to next starting character</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*SKIP)</span></code></span></dt><dd>Advance to current matching position</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*SKIP:<em>NAME</em>)</span></code></span></dt><dd>Advance to position corresponding to an earlier | |
| <code class="regex rouge"><span class="pcre2-semantic">(*MARK:<em>NAME</em>)</span></code>; if not found, the <code class="regex rouge"><span class="pcre2-semantic">(*SKIP)</span></code> is ignored</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(*THEN)</span></code></span></dt><dd>Local failure, backtrack to next alternation</dd></div></dl> | |
| <p>The effect of one of these verbs in a group called as a subroutine is confined | |
| to the subroutine call.</p></section> | |
| <section class="doc-section level-1"><h2 id="_callouts">Callouts</h2><dl class="compact" style="--tab-width: 6"><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?C)</span></code></span></dt><dd>Callout (assumed number 0)</dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?C<em>n</em>)</span></code></span></dt><dd>Callout with numerical data <em>n</em></dd></div><div class="dlist-item"><dt><span><code class="regex rouge"><span class="pcre2-semantic">(?C"<em>text</em>")</span></code></span></dt><dd>Callout with string data</dd></div></dl> | |
| <p>The allowed string delimiters are <code class="regex rouge"><span class="pcre2-semantic">'</span></code>, <code class="regex rouge"><span class="pcre2-semantic">"</span></code>, <code class="regex rouge"><span class="pcre2-semantic">^</span></code>, | |
| <code class="regex rouge"><span class="pcre2-semantic">%</span></code>, <code class="regex rouge"><span class="pcre2-semantic">#</span></code>, and <code class="regex rouge"><span class="pcre2-semantic">$</span></code> (which are the same for the start | |
| and the end), and the starting delimiter <code class="regex rouge"><span class="pcre2-semantic">{</span></code> matched with the ending | |
| delimiter <code class="regex rouge"><span class="pcre2-semantic">}</span></code>. To encode the ending delimiter within the string, double it.</p></section> | |
| <section class="doc-section level-1"><h2 id="_replacement_strings">Replacement strings</h2><p>If the <code class="constant pcre2-api rouge"><span class="no">PCRE2_SUBSTITUTE_LITERAL</span></code> option is set, a replacement string for | |
| <code class="function pcre2-api rouge"><span class="nf">pcre2_substitute()</span></code> is not interpreted. Otherwise, by default, the only | |
| special character is the dollar character in one of the following forms:</p> | |
| <dl class="compact" style="--tab-width: 10"><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">$$</span></code></span></dt><dd>Insert a dollar character</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">$<em>n</em></span></code> or <code class="repl rouge"><span class="pcre2-semantic">${<em>n</em>}</span></code></span></dt><dd>Insert the contents of group <em>n</em></dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">$<<em>name</em>></span></code></span></dt><dd>Insert the contents of named group</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">$0</span></code> or <code class="repl rouge"><span class="pcre2-semantic">$&</span></code></span></dt><dd>Insert the entire matched substring</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">$`</span></code></span></dt><dd>Insert the substring that precedes the match</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">$'</span></code></span></dt><dd>Insert the substring that follows the match</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">$_</span></code></span></dt><dd>Insert the entire input string</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">$+</span></code></span></dt><dd>Insert the highest-numbered capture group which matched</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">$*MARK</span></code> or <code class="repl rouge"><span class="pcre2-semantic">${*MARK}</span></code></span></dt><dd>Insert a control verb name</dd></div></dl> | |
| <p>For <code class="repl rouge"><span class="pcre2-semantic">${<em>n</em>}</span></code>, <em>n</em> can be a name or a number. If <code class="constant pcre2-api rouge"><span class="no">PCRE2_SUBSTITUTE_EXTENDED</span></code> is set, | |
| there is additional interpretation:</p> | |
| <ol class="arabic spaced"><li>Backslash is an escape character, and the forms described in "ESCAPED | |
| CHARACTERS" above are recognized. Also:<dl class="compact" style="--tab-width: 6"><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">\Q...\E</span></code></span></dt><dd>Suppress interpretation</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">\l</span></code></span></dt><dd>Force the next character to lower case</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">\u</span></code></span></dt><dd>Force the next character to upper case</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">\L</span></code></span></dt><dd>Force subsequent characters to lower case</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">\U</span></code></span></dt><dd>Force subsequent characters to upper case</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">\u\L</span></code></span></dt><dd>Force next character to upper case, then all lower</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">\l\U</span></code></span></dt><dd>Force next character to lower case, then all upper</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">\E</span></code></span></dt><dd>End <code class="repl rouge"><span class="pcre2-semantic">\L</span></code> or <code class="repl rouge"><span class="pcre2-semantic">\U</span></code> case forcing</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">\b</span></code></span></dt><dd>Backspace character (note: as in character class in pattern)</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">\v</span></code></span></dt><dd>Vertical tab character (note: not the same as in a pattern)</dd></div></dl></li><li>The Python form <code class="repl rouge"><span class="pcre2-semantic">\g<<em>n</em>></span></code>, where the angle brackets are part of the syntax and | |
| <em>n</em> is either a group name or a number, is recognized as an alternative way | |
| of inserting the contents of a group, for example <code class="repl rouge"><span class="pcre2-semantic">\g<3></span></code>.</li><li><p>Capture substitution supports the following additional forms:</p><dl class="compact" style="--tab-width: 12"><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">${<em>n</em>:-<em>string</em>}</span></code></span></dt><dd>Default for unset group</dd></div><div class="dlist-item"><dt><span><code class="repl rouge"><span class="pcre2-semantic">${<em>n</em>:+<em>string1</em>:<em>string2</em>}</span></code></span></dt><dd>Values for set/unset group</dd></div></dl> | |
| <p>The substitution strings themselves are expanded. Backslash can be used to | |
| escape colons and closing curly brackets.</p></li></ol></section> | |
| <section class="doc-section level-1"><h2 id="_see_also">See also</h2><p><a href="./pcre2pattern.html"><code>pcre2pattern</code></a>, <a href="./pcre2api.html"><code>pcre2api</code></a>, <a href="./pcre2callout.html"><code>pcre2callout</code></a>, | |
| <a href="./pcre2matching.html"><code>pcre2matching</code></a>, <a href="./pcre2.html"><code>pcre2</code></a>.</p> | |
| <h2 id="_author" class="discrete">Author</h2> | |
| <p>Philip Hazel<br> | |
| Retired from University Computing Service<br> | |
| Cambridge, England.</p> | |
| <h2 id="_revision" class="discrete">Revision</h2> | |
| <p>Last updated: 14 October 2025<br> | |
| Copyright © 1997-2024 University of Cambridge.</p></section></article></div></main><footer class="offline-footer"></footer></body></html> |