<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.33 (Ruby 3.2.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-jsonpath-iregexp-07" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.1 -->
  <front>
    <title abbrev="I-Regexp">I-Regexp: An Interoperable Regexp Format</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-jsonpath-iregexp-07"/>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <author initials="T." surname="Bray" fullname="Tim Bray">
      <organization>Textuality</organization>
      <address>
        <postal>
          <country>Canada</country>
        </postal>
        <email>tbray@textuality.com</email>
      </address>
    </author>
    <date year="2023" month="May" day="27"/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 67?>

<t>This document specifies I-Regexp, a flavor of regular expressions that is
limited in scope with the goal of interoperation across many different
regular-expression libraries.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-jsonpath-iregexp/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        JSONPath Working Group mailing list (<eref target="mailto:JSONPath@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/JSONPath/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/JSONPath/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-jsonpath/iregexp"/>.</t>
    </note>
  </front>
  <middle>
    <?line 73?>

<section anchor="intro">
      <name>Introduction</name>
      <t>This specification describes an interoperable regular expression ("regexp") flavor, I-Regexp.</t>
      <t>I-Regexp does not provide advanced regular expression features such as capture groups, lookahead, or backreferences.
It supports only a Boolean matching capability, i.e., testing whether a given regular expression matches a given piece of text.</t>
      <t>I-Regexp supports the entire repertoire of Unicode characters (Unicode
scalar values); both the I-Regexp strings themselves and the strings
they are matched against are sequences of Unicode scalar values (often
represented in UTF-8 encoding form <xref target="RFC3629"/> for interchange).</t>
      <t>I-Regexp is a subset of XSD regular expressions <xref target="XSD-2"/>.</t>
      <t>This document includes guidance for converting I-Regexps for use with several well-known regular expression idioms.</t>
      <t>The development of I-Regexp was motivated by the work of the JSONPath Working Group. The Working Group wanted to include
in its specification <xref target="I-D.ietf-jsonpath-base"/> support for the use of regular expressions in JSONPath filters, but was unable to find a useful
specification for regular expressions which would be interoperable across the popular libraries.</t>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>This document uses the abbreviation "regexp" for what are usually
called regular expressions in programming.
"I-Regexp" is used as a noun meaning a character string (sequence of
Unicode scalar values) that conforms to the requirements
in this specification; the plural is "I-Regexps".</t>
        <t>This specification uses Unicode terminology.
A good entry point into that is provided by <xref target="UNICODE-GLOSSARY"/>.</t>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<t>The grammatical rules in this document are to be interpreted as ABNF,
as described in <xref target="RFC5234"/> and <xref target="RFC7405"/>, where the "characters" of
<xref section="2.3" sectionFormat="of" target="RFC5234"/> are Unicode scalar values.</t>
      </section>
    </section>
    <section anchor="requirements">
      <name>Requirements</name>
      <t>I-Regexps should handle the vast majority of practical cases where a
matching regexp is needed in a data model specification or a query
language expression.</t>
      <t>The editors of this document conducted a survey of the regexp syntax
used in published RFCs. All examples found there should be covered by I-Regexps,
both syntactically and with their intended semantics.
The exception is the use of multi-character escapes, for which
workaround guidance is provided in <xref target="mapping"/>.</t>
    </section>
    <section anchor="defn">
      <name>I-Regexp Syntax</name>
      <t>An I-Regexp <bcp14>MUST</bcp14> conform to the ABNF specification in
<xref target="iregexp-abnf"/>.</t>
      <figure anchor="iregexp-abnf">
        <name>I-Regexp Syntax in ABNF</name>
        <sourcecode type="abnf"><![CDATA[
i-regexp = branch *( "|" branch )
branch = *piece
piece = atom [ quantifier ]
quantifier = ( "*" / "+" / "?" ) / range-quantifier
range-quantifier = "{" QuantExact [ "," [ QuantExact ] ] "}"
QuantExact = 1*%x30-39 ; '0'-'9'

atom = NormalChar / charClass / ( "(" i-regexp ")" )
NormalChar = ( %x00-27 / "," / "-" / %x2F-3E ; '/'-'>'
 / %x40-5A ; '@'-'Z'
 / %x5E-7A ; '^'-'z'
 / %x7E-10FFFF )
charClass = "." / SingleCharEsc / charClassEsc / charClassExpr
SingleCharEsc = "\" ( %x28-2B ; '('-'+'
 / "-" / "." / "?" / %x5B-5E ; '['-'^'
 / %s"n" / %s"r" / %s"t" / %x7B-7D ; '{'-'}'
 )
charClassEsc = catEsc / complEsc
charClassExpr = "[" [ "^" ] ( "-" / CCE1 ) *CCE1 [ "-" ] "]"
CCE1 = ( CCchar [ "-" CCchar ] ) / charClassEsc
CCchar = ( %x00-2C / %x2E-5A ; '.'-'Z'
 / %x5E-10FFFF ) / SingleCharEsc
catEsc = %s"\p{" charProp "}"
complEsc = %s"\P{" charProp "}"
charProp = IsCategory
IsCategory = Letters / Marks / Numbers / Punctuation / Separators /
    Symbols / Others
Letters = %s"L" [ ( %s"l" / %s"m" / %s"o" / %s"t" / %s"u" ) ]
Marks = %s"M" [ ( %s"c" / %s"e" / %s"n" ) ]
Numbers = %s"N" [ ( %s"d" / %s"l" / %s"o" ) ]
Punctuation = %s"P" [ ( %x63-66 ; 'c'-'f'
 / %s"i" / %s"o" / %s"s" ) ]
Separators = %s"Z" [ ( %s"l" / %s"p" / %s"s" ) ]
Symbols = %s"S" [ ( %s"c" / %s"k" / %s"m" / %s"o" ) ]
Others = %s"C" [ ( %s"c" / %s"f" / %s"n" / %s"o" ) ]
]]></sourcecode>
      </figure>
      <t>As an additional restriction, <tt>charClassExpr</tt> is not allowed to
match <tt>[^]</tt>, which according to this grammar would parse as a
positive character class containing the single character <tt>^</tt>.</t>
      <t>This is essentially XSD regexp without character class
subtraction, without multi-character escapes such as <tt>\s</tt>,
<tt>\S</tt>, and <tt>\w</tt>, and without Unicode blocks.</t>
      <t>An I-Regexp implementation <bcp14>MUST</bcp14> be a complete implementation of this
limited subset.
In particular, full support for the Unicode functionality defined in
this specification is <bcp14>REQUIRED</bcp14>; the implementation
<bcp14>MUST NOT</bcp14> limit itself to 7- or 8-bit character sets such as ASCII and
<bcp14>MUST</bcp14> support the Unicode character property set in character classes.</t>
      <section anchor="checking">
        <name>Checking Implementations</name>
        <t>A <em>checking</em> I-Regexp implementation is one that checks a supplied
regexp for compliance with this specification and reports any problems.
Checking implementations give their users confidence that they didn't
accidentally insert non-interoperable syntax, so checking is <bcp14>RECOMMENDED</bcp14>.
Exceptions to this rule may be made for low-effort implementations
that map I-Regexp to another regexp library by simple steps such as
performing the mapping operations discussed in <xref target="mapping"/>; here, the
effort needed to do full checking may dwarf the rest of the
implementation effort.
Implementations <bcp14>SHOULD</bcp14> document whether they are checking or not.</t>
        <t>Specifications that employ I-Regexp may want to define in which
cases their implementations can work with a non-checking I-Regexp
implementation and when full checking is needed, possibly in the
process of defining their own implementation classes.</t>
      </section>
    </section>
    <section anchor="i-regexp-semantics">
      <name>I-Regexp Semantics</name>
      <t>This syntax is a subset of that of <xref target="XSD-2"/>.
Implementations which interpret I-Regexps <bcp14>MUST</bcp14>
yield Boolean results as specified in <xref target="XSD-2"/>.
(See also <xref target="xsd-regexps"/>.)</t>
    </section>
    <section anchor="mapping">
      <name>Mapping I-Regexp to Regexp Dialects</name>
      <t>The material in this section is non-normative, provided as guidance
to developers who want to use I-Regexps in the context of other
regular expression dialects.</t>
      <section anchor="multi-character-escapes">
        <name>Multi-Character Escapes</name>
        <t>Common multi-character escapes (MCEs), and character classes built around them,
which are not supported in I-Regexp, can usually
be replaced as shown for example in <xref target="tbl-sub"/>.</t>
        <table anchor="tbl-sub">
          <name>Example substitutes for multi-character escapes</name>
          <thead>
            <tr>
              <th align="left">MCE/class</th>
              <th align="left">Replace with</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>\S</tt></td>
              <td align="left">
                <tt>[^ \t\n\r]</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>[\S ]</tt></td>
              <td align="left">
                <tt>[^\t\n\r]</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>\d</tt></td>
              <td align="left">
                <tt>[0-9]</tt></td>
            </tr>
          </tbody>
        </table>
        <t>Note that the semantics of <tt>\d</tt> in XSD regular expressions is that of
<tt>\p{Nd}</tt>; however, this would include all Unicode characters that are
digits in various writing systems, which is almost certainly not what is
required in IETF publications.</t>
        <t>The construct <tt>\p{IsBasicLatin}</tt> is essentially a reference to legacy
ASCII, it can be replaced by the character class <tt>[\u0000-\u007f]</tt>.</t>
      </section>
      <section anchor="xsd-regexps">
        <name>XSD Regexps</name>
        <t>Any I-Regexp also is an XSD Regexp <xref target="XSD-2"/>, so the mapping is an identity
function.</t>
        <t>Note that a few errata for <xref target="XSD-2"/> have been fixed in <xref target="XSD11-2"/>, which
is therefore also included as a normative reference.
XSD 1.1 is less widely implemented than XSD 1.0, and implementations
of XSD 1.0 are likely to include these bugfixes, so for the intents
and purposes of this specification an implementation of XSD 1.0
regexps is equivalent to an implementation of XSD 1.1 regexps.</t>
      </section>
      <section anchor="toESreg">
        <name>ECMAScript Regexps</name>
        <t>Perform the following steps on an I-Regexp to obtain an ECMAScript
regexp <xref target="ECMA-262"/>:</t>
        <ul spacing="normal">
          <li>For any unescaped dots (<tt>.</tt>) outside character classes (first alternative
of <tt>charClass</tt> production): replace dot by <tt>[^\n\r]</tt>.</li>
          <li>Envelope the result in <tt>^(?:</tt> and <tt>)$</tt>.</li>
        </ul>
        <t>The ECMAScript regexp is to be interpreted as a Unicode pattern ("u"
flag; see Section 21.2.2 "Pattern Semantics" of <xref target="ECMA-262"/>).</t>
        <t>Note that where a regexp literal is required,
the actual regexp needs to be enclosed in <tt>/</tt>.</t>
      </section>
      <section anchor="pcre-re2-ruby-regexps">
        <name>PCRE, RE2, Ruby Regexps</name>
        <t>Perform the same steps as in <xref target="toESreg"/> to obtain a valid regexp in
PCRE <xref target="PCRE2"/>, the Go programming language <xref target="RE2"/>, and the Ruby
programming language, except that the last step is:</t>
        <ul spacing="normal">
          <li>Enclose the regexp in <tt>\A(?:</tt> and <tt>)\z</tt>.</li>
        </ul>
      </section>
    </section>
    <section anchor="background">
      <name>Motivation and Background</name>
      <t>While regular expressions originally were intended to describe a
formal language to support a Boolean matching function, they
have been enhanced with parsing functions that support the extraction
and replacement of arbitrary portions of the matched text. With this
accretion of features, parsing regexp libraries have become
more susceptible to bugs and surprising performance degradations which
can be exploited in Denial of Service attacks by
an attacker who controls the regexp submitted for
processing. I-Regexp is designed to offer interoperability, and to be
less vulnerable to such attacks, with the trade-off that its only
function is to offer a boolean response as to whether a character
sequence is matched by a regexp.</t>
      <section anchor="subsetting">
        <name>Implementing I-Regexp</name>
        <t>XSD regexps are relatively easy to implement or map to widely
implemented parsing regexp dialects, with these notable
exceptions:</t>
        <ul spacing="normal">
          <li>Character class subtraction.  This is a very useful feature in many
specifications, but it is unfortunately mostly absent from parsing
regexp dialects. Thus, it is omitted from I-Regexp.</li>
          <li>Multi-character escapes.  <tt>\d</tt>, <tt>\w</tt>, <tt>\s</tt> and their uppercase
complement classes exhibit a
large amount of variation between regexp flavors.  Thus, they are
omitted from I-Regexp.</li>
          <li>Not all regexp implementations
support accesses to Unicode tables that enable
executing constructs such as <tt>\p{Nd}</tt>,
although the <tt>\p</tt>/<tt>\P</tt> feature in general is now quite
widely available. While in principle it is possible to
translate these into character-class matches, this also requires
access to those tables. Thus, regexp libraries in severely
constrained environments may not be able to support I-Regexp
conformance.</li>
        </ul>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document makes no requests of IANA.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security considerations</name>
      <t>While technically out of scope of this specification, Section <xref target="RFC3629" section="10" sectionFormat="bare">Security Considerations</xref> of <xref target="RFC3629"/> applies to implementations.
Particular note needs to be taken of the last paragraph of Section <xref target="RFC3629" section="3" sectionFormat="bare">UTF-8 definition</xref> of <xref target="RFC3629"/>; an I-Regexp implementation may need to
mitigate limitations of the platform implementation in this regard.</t>
      <t>As discussed in <xref target="background"/>, more complex regexp libraries may
contain exploitable bugs leading to crashes and remote code
execution.  There is also the problem that such libraries often have
hard-to-predict performance characteristics, leading to attacks
that overload an implementation by matching against an expensive
attacker-controlled regexp.</t>
      <t>I-Regexps have been designed to allow implementation in a way that is
resilient to both threats; this objective needs to be addressed
throughout the implementation effort.
Non-checking implementations (see <xref target="checking"/>) are likely to expose
security limitations of any regexp engine they use, which may be less
problematic if that engine has been built with security considerations
in mind (e.g., <xref target="RE2"/>); a checking implementation is still <bcp14>RECOMMENDED</bcp14>.</t>
      <t>Implementations that specifically implement the I-Regexp subset can,
with care, be designed to generally run in linear time and space in
the input, and to detect when that would not be the case (see below).</t>
      <t>Existing regexp engines should be able to easily handle most I-Regexps
(after the adjustments discussed in <xref target="mapping"/>), but may consume
excessive resources for some types of I-Regexps or outright reject
them because they cannot guarantee efficient execution.</t>
      <t>Specifically, range quantifiers (as in <tt>a{2,4}</tt>) provide specific
challenges for both existing and I-Regexp specific implementations.
These may therefore limit range quantifiers in composability
(disallowing nested range quantifiers such as <tt>(a{2,4}){2,4}</tt>) or
range (disallowing very large ranges such as <tt>a{20,200000}</tt>), or detect
and reject any excessive resource consumption caused by them.
Note that different versions of the same regexp library may be more or
less vulnerable to excessive resource consumption for these cases.</t>
      <t>I-Regexp implementations that are used to evaluate regexps from
untrusted sources need to be robust to these cases.
Implementers using existing regexp libraries are encouraged to check
their documentation to see if mitigations are configurable, such as
limits in resource consumption, and to document their own degree of
robustness resulting from employing such mitigations.</t>
    </section>
  </middle>
  <back>
    <displayreference target="RFC3629" to="STD63"/>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="XSD-2" target="https://www.w3.org/TR/2004/REC-xmlschema-2-20041028/">
          <front>
            <title>XML Schema Part 2: Datatypes Second Edition</title>
            <author fullname="Ashok Malhotra" role="editor"/>
            <author fullname="Paul V. Biron" role="editor"/>
            <date day="28" month="October" year="2004"/>
          </front>
          <seriesInfo name="W3C REC" value="REC-xmlschema-2-20041028"/>
          <seriesInfo name="W3C" value="REC-xmlschema-2-20041028"/>
        </reference>
        <reference anchor="XSD11-2" target="https://www.w3.org/TR/2012/REC-xmlschema11-2-20120405/">
          <front>
            <title>W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes</title>
            <author fullname="Ashok Malhotra" role="editor"/>
            <author fullname="David Peterson" role="editor"/>
            <author fullname="Henry Thompson" role="editor"/>
            <author fullname="Michael Sperberg-McQueen" role="editor"/>
            <author fullname="Paul V. Biron" role="editor"/>
            <author fullname="Sandy Gao" role="editor"/>
            <date day="5" month="April" year="2012"/>
          </front>
          <seriesInfo name="W3C REC" value="REC-xmlschema11-2-20120405"/>
          <seriesInfo name="W3C" value="REC-xmlschema11-2-20120405"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker">
              <organization/>
            </author>
            <author fullname="P. Overell" initials="P." surname="Overell">
              <organization/>
            </author>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax.  Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications.  The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power.  The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges.  This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
        <reference anchor="RFC7405">
          <front>
            <title>Case-Sensitive String Support in ABNF</title>
            <author fullname="P. Kyzivat" initials="P." surname="Kyzivat">
              <organization/>
            </author>
            <date month="December" year="2014"/>
            <abstract>
              <t>This document extends the base definition of ABNF (Augmented Backus-Naur Form) to include a way to specify US-ASCII string literals that are matched in a case-sensitive manner.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7405"/>
          <seriesInfo name="DOI" value="10.17487/RFC7405"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC3629">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau">
              <organization/>
            </author>
            <date month="November" year="2003"/>
            <abstract>
              <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems.  The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo.  UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values.  This memo obsoletes and replaces RFC 2279.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </reference>
        <reference anchor="I-D.ietf-jsonpath-base">
          <front>
            <title>JSONPath: Query expressions for JSON</title>
            <author fullname="Stefan Gössner" initials="S." surname="Gössner">
              <organization>Fachhochschule Dortmund</organization>
            </author>
            <author fullname="Glyn Normington" initials="G." surname="Normington">
         </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="15" month="April" year="2023"/>
            <abstract>
              <t>   JSONPath defines a string syntax for selecting and extracting JSON
   (RFC 8259) values from a JSON value.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-jsonpath-base-13"/>
        </reference>
        <reference anchor="UNICODE-GLOSSARY" target="https://unicode.org/glossary/">
          <front>
            <title>Glossary of Unicode Terms</title>
            <author>
              <organization>Unicode, Inc.</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RE2" target="https://github.com/google/re2">
          <front>
            <title>RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Perl, and Python. It is a C++ library.</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="PCRE2" target="http://pcre.org/current/doc/html/">
          <front>
            <title>Perl-compatible Regular Expressions (revised API: PCRE2)</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ECMA-262" target="https://www.ecma-international.org/wp-content/uploads/ECMA-262.pdf">
          <front>
            <title>ECMAScript 2020 Language Specification</title>
            <author>
              <organization>Ecma International</organization>
            </author>
            <date year="2020" month="June"/>
          </front>
          <seriesInfo name="ECMA" value="Standard ECMA-262, 11th Edition"/>
        </reference>
        <reference anchor="RFC7493">
          <front>
            <title>The I-JSON Message Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray">
              <organization/>
            </author>
            <date month="March" year="2015"/>
            <abstract>
              <t>I-JSON (short for "Internet JSON") is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7493"/>
          <seriesInfo name="DOI" value="10.17487/RFC7493"/>
        </reference>
      </references>
    </references>
    <?line 387?>

<section anchor="rfcs" removeInRFC="true">
      <name>Regexps and Similar Constructs in Recent Published RFCs</name>
      <t>This appendix contains a number of regular expressions that have been
extracted from some recently published RFCs based on some ad-hoc matching.
Multi-line constructions were not included.
With the exception of some (often surprisingly dubious) usage of multi-character
escapes and a reference to the <tt>IsBasicLatin</tt> Unicode block, all
regular expressions validate against the ABNF in <xref target="iregexp-abnf"/>.</t>
      <figure anchor="iregexp-examples">
        <name>Example regular expressions extracted from RFCs</name>
        <artwork><![CDATA[
rfc6021.txt  459 (([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))
rfc6021.txt  513 \d*(\.\d*){1,127}
rfc6021.txt  529 \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?
rfc6021.txt  631 ([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?
rfc6021.txt  647 [0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}
rfc6021.txt  933 ((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}
rfc6021.txt  938 (([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|
rfc6021.txt 1026 ((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}
rfc6021.txt 1031 (([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|
rfc6020.txt 6647 [0-9a-fA-F]*
rfc6095.txt 2544 \S(.*\S)?
rfc6110.txt 1583 [aeiouy]*
rfc6110.txt 3222 [A-Z][a-z]*
rfc6536.txt 1583 \*
rfc6536.txt 1632 [^\*].*
rfc6643.txt  524 \p{IsBasicLatin}{0,255}
rfc6728.txt 3480 \S+
rfc6728.txt 3500 \S(.*\S)?
rfc6991.txt  477 (([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))
rfc6991.txt  525 \d*(\.\d*){1,127}
rfc6991.txt  541 [a-zA-Z_][a-zA-Z0-9\-_.]*
rfc6991.txt  542 .|..|[^xX].*|.[^mM].*|..[^lL].*
rfc6991.txt  571 \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?
rfc6991.txt  665 ([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?
rfc6991.txt  693 [0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}
rfc6991.txt  725 ([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?
rfc6991.txt  743 [0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-
rfc6991.txt 1041 ((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}
rfc6991.txt 1046 (([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|
rfc6991.txt 1099 [0-9\.]*
rfc6991.txt 1109 [0-9a-fA-F:\.]*
rfc6991.txt 1164 ((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}
rfc6991.txt 1169 (([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|
rfc7407.txt  933 ([0-9a-fA-F]){2}(:([0-9a-fA-F]){2}){0,254}
rfc7407.txt 1494 ([0-9a-fA-F]){2}(:([0-9a-fA-F]){2}){4,31}
rfc7758.txt  703 \d{2}:\d{2}:\d{2}(\.\d+)?
rfc7758.txt 1358 \d{2}:\d{2}:\d{2}(\.\d+)?
rfc7895.txt  349 \d{4}-\d{2}-\d{2}
rfc7950.txt 8323 [0-9a-fA-F]*
rfc7950.txt 8355 [a-zA-Z_][a-zA-Z0-9\-_.]*
rfc7950.txt 8356 [xX][mM][lL].*
rfc8040.txt 4713 \d{4}-\d{2}-\d{2}
rfc8049.txt 6704 [A-Z]{2}
rfc8194.txt  629 \*
rfc8194.txt  637 [0-9]{8}\.[0-9]{6}
rfc8194.txt  905 Z|[\+\-]\d{2}:\d{2}
rfc8194.txt  963 (2((2[4-9])|(3[0-9]))\.).*
rfc8194.txt  974 (([fF]{2}[0-9a-fA-F]{2}):).*
rfc8299.txt 7986 [A-Z]{2}
rfc8341.txt 1878 \*
rfc8341.txt 1927 [^\*].*
rfc8407.txt 1723 [0-9\.]*
rfc8407.txt 1749 [a-zA-Z_][a-zA-Z0-9\-_.]*
rfc8407.txt 1750 .|..|[^xX].*|.[^mM].*|..[^lL].*
rfc8525.txt  550 \d{4}-\d{2}-\d{2}
rfc8776.txt  838 /?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*
rfc8776.txt  874 ([a-zA-Z0-9\-_.]+:)*
rfc8819.txt  311 [\S ]+
rfc8944.txt  596 [0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){7}
]]></artwork>
      </figure>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This specification has been motivated by the discussion in the IETF JSONPATH
WG about whether to include a regexp mechanism into the JSONPath query
expression specification, as well as by previous discussions about the
YANG <tt>pattern</tt> and CDDL <tt>.regexp</tt> features.</t>
      <t>The basic approach for this specification was inspired by <xref target="RFC7493">The
I-JSON Message Format</xref>.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
VkESTceRb3ECyibMfxinRQj+/wHLEY2GW0cAAA==

-->

</rfc>
