blob: b59dc571b0c25fe79da0452c92d0971dd58352a0 [file] [edit]
<!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&amp;</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&amp;&amp;[^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&amp;&amp;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} &amp; \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>) &amp; <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] &amp; \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 &amp; [: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&amp;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">(?&lt;<em>name</em>&gt;...)</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&lt;<em>name</em>&gt;...)</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">(?&gt;...)</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">(?&lt;=...)</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">(?&lt;!...)</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">(?&lt;*...)</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">&lt;<em>name</em>&gt;</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&lt;<em>name</em>&gt;</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">(?&amp;<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&gt;<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&lt;<em>name</em>&gt;</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&lt;<em>n</em>&gt;</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&lt;+<em>n</em>&gt;</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&lt;-<em>n</em>&gt;</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">(?&amp;<em>name</em>(<em>grouplist</em>))</span></code><br><code class="regex rouge"><span class="pcre2-semantic">(?P&gt;<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">&lt;<em>name</em>&gt;</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">(?(&lt;<em>name</em>&gt;)</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&amp;<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>&gt;<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">$&lt;<em>name</em>&gt;</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">$&amp;</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&lt;<em>n</em>&gt;</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&lt;3&gt;</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>