Sophie

Sophie

distrib > Mandriva > 9.1 > ppc > media > main > by-pkgid > 0afeee9cca140e167a996902b9a677c5 > files > 3041

php-manual-en-4.3.0-2mdk.noarch.rpm

<HTML
><HEAD
><TITLE
>Pattern Syntax</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK
REL="HOME"
TITLE="PHP Manual"
HREF="index.html"><LINK
REL="UP"
TITLE="Regular Expression Functions (Perl-Compatible)"
HREF="ref.pcre.html"><LINK
REL="PREVIOUS"
TITLE="Pattern Modifiers"
HREF="pcre.pattern.modifiers.html"><LINK
REL="NEXT"
TITLE="preg_grep"
HREF="function.preg-grep.html"><META
HTTP-EQUIV="Content-type"
CONTENT="text/html; charset=ISO-8859-1"></HEAD
><BODY
CLASS="refentry"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>PHP Manual</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="pcre.pattern.modifiers.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="function.preg-grep.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><H1
><A
NAME="pcre.pattern.syntax"
></A
>Pattern Syntax</H1
><DIV
CLASS="refnamediv"
><A
NAME="AEN81011"
></A
>Pattern Syntax&nbsp;--&nbsp;Describes PCRE regex syntax</DIV
><DIV
CLASS="refsect1"
><A
NAME="AEN81014"
></A
><H2
>Description</H2
><P
>&#13;     The PCRE library is a set of functions that implement regular
     expression pattern matching using the same syntax and semantics
     as Perl 5, with just a few differences (see below).  The current
     implementation corresponds to Perl 5.005.
    </P
></DIV
><DIV
CLASS="refsect1"
><A
NAME="AEN81017"
></A
><H2
>Differences From Perl</H2
><P
>&#13;     The differences described here are with respect to Perl 5.005.
    <P
></P
><OL
TYPE="1"
><LI
><P
>&#13;       By default, a whitespace character is any character  that
       the C library function isspace() recognizes, though it is
       possible to compile PCRE  with alternative character type
       tables. Normally isspace() matches space, formfeed, newline,
       carriage return, horizontal tab, and vertical tab. Perl 5 no
       longer  includes vertical tab in its set of whitespace characters.
       The \v escape that was in the Perl documentation for
       a long time was never in fact recognized. However, the character
       itself was treated as whitespace at least up to 5.002.
       In 5.004 and 5.005 it does not match \s.
      </P
></LI
><LI
><P
>&#13;     PCRE does not allow repeat quantifiers on lookahead
     assertions. Perl permits them, but they do not mean what you
     might think. For example, (?!a){3} does not assert that  the
     next three characters are not "a". It just asserts that the
     next character is not "a" three times.
      </P
></LI
><LI
><P
>&#13;     Capturing subpatterns that occur inside negative looka-
     head assertions are counted, but their entries in the
     offsets vector are never set. Perl sets its numerical vari-
     ables from any such patterns that are matched before the
     assertion fails to match something (thereby succeeding), but
     only  if  the negative lookahead assertion contains just one
     branch.
      </P
></LI
><LI
><P
>&#13;     Though binary zero characters are supported in  the  subject  string,
     they are not allowed in a pattern string because it is passed as a
     normal C string, terminated  by zero. The escape sequence "\\x00" can
     be used in the pattern to represent a binary zero.
      </P
></LI
><LI
><P
>&#13;     The following Perl escape sequences  are  not  supported:
     \l,  \u,  \L,  \U,  \E, \Q. In fact these are implemented by
     Perl's general string-handling and are not part of its  pat-
     tern matching engine.
      </P
></LI
><LI
><P
>&#13;     The Perl \G assertion is  not  supported  as  it  is  not
     relevant to single pattern matches.
      </P
></LI
><LI
><P
>&#13;     Fairly obviously, PCRE does not support the (?{code})
     construction.
      </P
></LI
><LI
><P
>&#13;     There are at the time of writing some  oddities  in  Perl
     5.005_02  concerned  with  the  settings of captured strings
     when part of a pattern is repeated.  For  example,  matching
     "aba"  against the pattern /^(a(b)?)+$/ sets $2 to the value
     "b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves  $2
     unset.    However,    if   the   pattern   is   changed   to
     /^(aa(b(b))?)+$/ then $2 (and $3) get set.
     In Perl 5.004 $2 is set in both cases, and that is also <TT
CLASS="constant"
><B
>TRUE</B
></TT
>
     of PCRE. If in the future Perl changes to a consistent state
     that is different, PCRE may change to follow.
      </P
></LI
><LI
><P
>&#13;     Another as yet unresolved discrepancy  is  that  in  Perl
     5.005_02  the  pattern /^(a)?(?(1)a|b)+$/ matches the string
     "a", whereas in PCRE it does not.  However, in both Perl and
     PCRE /^(a)?a/ matched against "a" leaves $1 unset.
      </P
></LI
><LI
><P
>&#13;     PCRE  provides  some  extensions  to  the  Perl  regular
     expression facilities:
        <P
></P
><OL
TYPE="a"
><LI
><P
>&#13;     Although lookbehind assertions must match  fixed  length
     strings,  each  alternative branch of a lookbehind assertion
     can match a different length of string. Perl 5.005  requires
     them all to have the same length.
         </P
></LI
><LI
><P
>&#13;     If <A
HREF="pcre.pattern.modifiers.html"
>PCRE_DOLLAR_ENDONLY</A
>  is set and 
     <A
HREF="pcre.pattern.modifiers.html"
>PCRE_MULTILINE</A
>  is  not
     set,  the  $ meta- character matches only at the very end of
     the string.
         </P
></LI
><LI
><P
>&#13;     If <A
HREF="pcre.pattern.modifiers.html"
>PCRE_EXTRA</A
>  is set, a backslash followed by  a  letter
     with no special meaning is faulted.
         </P
></LI
><LI
><P
>&#13;     If <A
HREF="pcre.pattern.modifiers.html"
>PCRE_UNGREEDY</A
>  is set, the greediness of  the  repeti-
     tion  quantifiers  is inverted, that is, by default they are
     not greedy, but if followed by a question mark they are.
         </P
></LI
></OL
>
      </P
></LI
></OL
>
   </P
></DIV
><DIV
CLASS="refsect1"
><A
NAME="regexp.reference"
></A
><H2
>Regular Expression Details</H2
><DIV
CLASS="refsect2"
><A
NAME="regexp.introduction"
></A
><H3
>Introduction</H3
><P
>&#13;     The syntax and semantics of  the  regular  expressions  sup-
     ported  by PCRE are described below. Regular expressions are
     also described in the Perl documentation and in a number  of
     other  books,  some  of which have copious examples. Jeffrey
     Friedl's  "Mastering  Regular  Expressions",  published   by
     O'Reilly  (ISBN 1-56592-257-3), covers them in great detail.
     The description here is intended as reference documentation.

     A regular expression is a pattern that is matched against  a
     subject string from left to right. Most characters stand for
     themselves in a pattern, and match the corresponding charac-
     ters in the subject. As a trivial example, the pattern
       <TT
CLASS="literal"
>The quick brown fox</TT
>
     matches a portion of a subject string that is  identical  to
     itself.  
    </P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.meta"
></A
><H3
>Meta-characters</H3
><P
>     
     The  power  of  regular  expressions comes from the
     ability to include alternatives and repetitions in the  pat-
     tern.  These  are encoded in the pattern by the use of <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>meta</I
></SPAN
>-
     <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>characters</I
></SPAN
>, which do not stand for  themselves  but  instead
     are interpreted in some special way.
    </P
><P
>&#13;     There are two different sets of meta-characters: those  that
     are  recognized anywhere in the pattern except within square
     brackets, and those that are recognized in square brackets.
     Outside square brackets, the meta-characters are as follows:
      <P
></P
><DIV
CLASS="variablelist"
><DL
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\</I
></SPAN
></DT
><DD
><P
>&#13;          general escape character with several uses
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>^</I
></SPAN
></DT
><DD
><P
>&#13;          assert start of subject (or line, in multiline mode)
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>$</I
></SPAN
></DT
><DD
><P
>&#13;          assert end of subject (or line, in multiline mode)
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>.</I
></SPAN
></DT
><DD
><P
>&#13;          match any character except newline (by default)
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>[</I
></SPAN
></DT
><DD
><P
>&#13;           start character class definition
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>]</I
></SPAN
></DT
><DD
><P
>&#13;          end character class definition
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>|</I
></SPAN
></DT
><DD
><P
>&#13;           start of alternative branch
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>(</I
></SPAN
></DT
><DD
><P
>&#13;           start subpattern
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>)</I
></SPAN
></DT
><DD
><P
>&#13;          end subpattern
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>?</I
></SPAN
></DT
><DD
><P
>&#13;          extends the meaning of (, also 0 or 1 quantifier, also quantifier minimizer
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>*</I
></SPAN
></DT
><DD
><P
>&#13;          0 or more quantifier
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>+</I
></SPAN
></DT
><DD
><P
>&#13;          1 or more quantifier
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>{</I
></SPAN
></DT
><DD
><P
>&#13;          start min/max quantifier
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>}</I
></SPAN
></DT
><DD
><P
>&#13;          end min/max quantifier
         </P
></DD
></DL
></DIV
>

     Part of a pattern that is in square  brackets is called a
     "character  class". In a character class the only meta-
     characters are:
      <P
></P
><DIV
CLASS="variablelist"
><DL
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\</I
></SPAN
></DT
><DD
><P
>&#13;          general escape character
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>^</I
></SPAN
></DT
><DD
><P
>&#13;          negate the class, but only if the first character
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>-</I
></SPAN
></DT
><DD
><P
>&#13;          indicates character range
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>]</I
></SPAN
></DT
><DD
><P
>&#13;          terminates the character class
         </P
></DD
></DL
></DIV
>
     The following sections describe the use of each of the
     meta-characters.
    </P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.backslash"
></A
><H3
>backslash</H3
><P
>&#13;     The backslash character has several uses. Firstly, if it  is
     followed by a non-alphanumeric character, it takes away any
     special  meaning that character may have. This use of
     backslash as an escape character applies both inside and
     outside character classes.
    </P
><P
>&#13;     For example, if you want to match a "*" character, you write
     "\*" in the pattern. This applies whether or not the follow-
     ing character would otherwise be interpreted as a meta-
     character, so it is always safe to precede a non-alphanumeric
     with "\" to specify that it stands for itself.  In  particu-
     lar, if you want to match a backslash, you write "\\".
    </P
><P
>&#13;     If a pattern is compiled with the <A
HREF="pcre.pattern.modifiers.html"
>PCRE_EXTENDED</A
>  option, whi-
     tespace in the pattern (other than in a character class) and
     characters between a "#" outside a character class  and  the
     next  newline  character  are ignored. An escaping backslash
     can be used to include a whitespace or "#" character as part
     of the pattern.
    </P
><P
>&#13;     A second use of backslash provides a way of encoding non-
     printing characters in patterns in a visible manner. There
     is no restriction on the appearance of non-printing  characters,
     apart from the binary zero that terminates a pattern,
     but when a pattern is being prepared by text editing, it is
     usually  easier to use one of the following escape sequences
     than the binary character it represents:
    </P
><P
>&#13;      <P
></P
><DIV
CLASS="variablelist"
><DL
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\a</I
></SPAN
></DT
><DD
><P
>&#13;          alarm, that is, the BEL character (hex 07)
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\cx</I
></SPAN
></DT
><DD
><P
>&#13;           "control-x", where x is any character
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\e</I
></SPAN
></DT
><DD
><P
>&#13;          escape (hex 1B)
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\f</I
></SPAN
></DT
><DD
><P
>&#13;          formfeed (hex 0C)
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\n</I
></SPAN
></DT
><DD
><P
>&#13;          newline (hex 0A)
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\r</I
></SPAN
></DT
><DD
><P
>&#13;          carriage return (hex 0D)
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\t</I
></SPAN
></DT
><DD
><P
>&#13;          tab (hex 09)
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\xhh</I
></SPAN
></DT
><DD
><P
>&#13;           character with hex code hh
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\ddd</I
></SPAN
></DT
><DD
><P
>&#13;          character with octal code ddd, or backreference
         </P
></DD
></DL
></DIV
>
    </P
><P
>&#13;     The precise effect of "<TT
CLASS="literal"
>\cx</TT
>" is as follows: 
     if "<TT
CLASS="literal"
>x</TT
>" is a lower case  letter, it is converted
     to upper case. Then bit 6 of the character (hex 40) is inverted. 
     Thus "<TT
CLASS="literal"
>\cz</TT
>" becomes  hex 1A, but
     "<TT
CLASS="literal"
>\c{</TT
>" becomes hex 3B, while "<TT
CLASS="literal"
>\c;</TT
>"
     becomes hex 7B.
    </P
><P
>&#13;     After "<TT
CLASS="literal"
>\x</TT
>", up to two hexadecimal digits are
     read (letters can be in upper or lower case).
    </P
><P
>&#13;     After "<TT
CLASS="literal"
>\0</TT
>" up to two further octal digits are read.
     In  both cases,  if  there are fewer than two digits, just those that
     are present are used. Thus the sequence "<TT
CLASS="literal"
>\0\x\07</TT
>" 
     specifies two binary zeros followed by a BEL character. Make sure you
     supply two digits after the initial zero if the character
     that follows is itself an octal digit.
    </P
><P
>&#13;     The handling of a backslash followed by a digit other than 0
     is complicated. Outside a character class, PCRE reads it
     and any following digits as a decimal number. If the  number
     is  less  than  10, or if there have been at least that many
     previous capturing left parentheses in the  expression,  the
     entire  sequence is taken as a <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>back</I
></SPAN
> 
     <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>reference</I
></SPAN
>. A description
     of how this works is given later, following  the  discussion
     of parenthesized subpatterns.
    </P
><P
>&#13;     Inside a character  class,  or  if  the  decimal  number  is
     greater than 9 and there have not been that many capturing
     subpatterns, PCRE re-reads up to three octal digits following 
     the backslash, and generates a single byte from the
     least significant 8 bits of the value. Any subsequent digits
     stand for themselves.  For example:
    </P
><P
>&#13;      <P
></P
><DIV
CLASS="variablelist"
><DL
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\040</I
></SPAN
></DT
><DD
><P
>&#13;          is another way of writing a space
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\40</I
></SPAN
></DT
><DD
><P
>&#13;          is the same, provided there are fewer than 40
          previous capturing subpatterns
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\7</I
></SPAN
></DT
><DD
><P
>&#13;          is always a back reference
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\11</I
></SPAN
></DT
><DD
><P
>&#13;          might be a back reference, or another way of
          writing a tab
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\011</I
></SPAN
></DT
><DD
><P
>&#13;          is always a tab
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\0113</I
></SPAN
></DT
><DD
><P
>&#13;          is a tab followed by the character "3"
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\113</I
></SPAN
></DT
><DD
><P
>&#13;          is the character with octal code 113 (since there
          can be no more than 99 back references)
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\377</I
></SPAN
></DT
><DD
><P
>&#13;           is a byte consisting entirely of 1 bits
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\81</I
></SPAN
></DT
><DD
><P
>&#13;          is either a back reference, or a binary zero
          followed by the two characters "8" and "1"
         </P
></DD
></DL
></DIV
>
    </P
><P
>&#13;     Note that octal values of 100 or greater must not be intro-
     duced by a leading zero, because no more than three octal
     digits are ever read.
    </P
><P
>&#13;     All the sequences that define a single byte value can  be
     used both inside and outside character classes. In addition,
     inside a character class, the sequence "<TT
CLASS="literal"
>\b</TT
>"
     is interpreted as the backspace character (hex 08). Outside a character
     class it has a different meaning (see below).
    </P
><P
>&#13;     The third use of backslash is for specifying generic charac-
     ter types:
    </P
><P
>&#13;      <P
></P
><DIV
CLASS="variablelist"
><DL
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\d</I
></SPAN
></DT
><DD
><P
>&#13;          any decimal digit
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\D</I
></SPAN
></DT
><DD
><P
>&#13;          any character that is not a decimal digit
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\s</I
></SPAN
></DT
><DD
><P
>&#13;          any whitespace character
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\S</I
></SPAN
></DT
><DD
><P
>&#13;          any character that is not a whitespace character
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\w</I
></SPAN
></DT
><DD
><P
>&#13;          any "word" character
         </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\W</I
></SPAN
></DT
><DD
><P
>&#13;          any "non-word" character
         </P
></DD
></DL
></DIV
>
    </P
><P
>&#13;     Each pair of escape sequences partitions the complete set of
     characters into two disjoint sets. Any given character
     matches one, and only one, of each pair.
    </P
><P
>&#13;     A "word" character is any letter or digit or the underscore
     character,  that  is,  any  character which can be part of a
     Perl "<TT
CLASS="literal"
>word</TT
>". The definition of letters and digits is  
     controlled by PCRE's character tables, and may vary if locale-specific
     matching is taking place (see  "Locale  support"
     above). For example, in the "fr" (French) locale, some char-
     acter codes greater than 128 are used for accented letters,
     and these are matched by <TT
CLASS="literal"
>\w</TT
>.
    </P
><P
>&#13;     These character type sequences can appear both inside and
     outside  character classes. They each match one character of
     the appropriate type. If the current matching  point is at
     the end of the subject string, all of them fail, since there
     is no character to match.
    </P
><P
>&#13;     The fourth use of backslash is  for  certain  simple  asser-
     tions. An assertion specifies a condition that has to be met
     at a particular point in  a match, without consuming any
     characters from the subject string. The use of subpatterns
     for more complicated assertions is described below. The
     backslashed assertions are
    </P
><P
>&#13;     <P
></P
><DIV
CLASS="variablelist"
><DL
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\b</I
></SPAN
></DT
><DD
><P
>&#13;         word boundary
        </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\B</I
></SPAN
></DT
><DD
><P
>&#13;          not a word boundary
        </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\A</I
></SPAN
></DT
><DD
><P
>&#13;         start of subject (independent of multiline mode)
        </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\Z</I
></SPAN
></DT
><DD
><P
>&#13;        end of subject or newline at end (independent of
        multiline mode)
        </P
></DD
><DT
><SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>\z</I
></SPAN
></DT
><DD
><P
>&#13;         end of subject(independent of multiline mode)
        </P
></DD
></DL
></DIV
>
    </P
><P
>&#13;     These assertions may not appear in  character  classes  (but
     note that "<TT
CLASS="literal"
>\b</TT
>" has a different meaning, namely the backspace
     character, inside a character class).
    </P
><P
>&#13;     A word boundary is a position in the subject string where
     the current character and the previous character do not both
     match <TT
CLASS="literal"
>\w</TT
> or <TT
CLASS="literal"
>\W</TT
> (i.e. one matches 
     <TT
CLASS="literal"
>\w</TT
> and  the  other  matches
     <TT
CLASS="literal"
>\W</TT
>), or the start or end of the string if the first
     or last character matches \w, respectively.
    </P
><P
>&#13;     The <TT
CLASS="literal"
>\A</TT
>, <TT
CLASS="literal"
>\Z</TT
>, and
     <TT
CLASS="literal"
>\z</TT
> assertions differ  from  the  traditional
     circumflex  and  dollar  (described below) in that they only
     ever match at the very start and end of the subject  string,
     whatever  options  are  set.  They  are  not affected by the
     <A
HREF="pcre.pattern.modifiers.html"
>PCRE_NOTBOL</A
> or
     <A
HREF="pcre.pattern.modifiers.html"
>PCRE_NOTEOL</A
> options.
     The  difference  between <TT
CLASS="literal"
>\Z</TT
> and
     <TT
CLASS="literal"
>\z</TT
>  is that <TT
CLASS="literal"
>\Z</TT
>
     matches before a newline that is the
     last character of the string as well as at the  end  of  the
     string, whereas <TT
CLASS="literal"
>\z</TT
> matches only at the end.
     </P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.circudollar"
></A
><H3
>Circumflex and dollar</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Outside&nbsp;a&nbsp;character&nbsp;class,&nbsp;in&nbsp;the&nbsp;default&nbsp;matching&nbsp;mode,&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;circumflex&nbsp;&nbsp;character&nbsp;&nbsp;is&nbsp;an&nbsp;assertion&nbsp;which&nbsp;is&nbsp;true&nbsp;only&nbsp;if<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;current&nbsp;matching&nbsp;point&nbsp;is&nbsp;at&nbsp;the&nbsp;start&nbsp;&nbsp;of&nbsp;&nbsp;the&nbsp;&nbsp;subject<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string.&nbsp;Inside&nbsp;a&nbsp;character&nbsp;class,&nbsp;circumflex&nbsp;has&nbsp;an&nbsp;entirely<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;different&nbsp;meaning&nbsp;(see&nbsp;below).<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Circumflex&nbsp;need&nbsp;not&nbsp;be&nbsp;the&nbsp;first&nbsp;character&nbsp;of&nbsp;the&nbsp;pattern&nbsp;if<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;number&nbsp;of&nbsp;alternatives&nbsp;are&nbsp;involved,&nbsp;but&nbsp;it&nbsp;should&nbsp;be&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;thing&nbsp;in&nbsp;each&nbsp;alternative&nbsp;in&nbsp;which&nbsp;it&nbsp;appears&nbsp;&nbsp;if&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern&nbsp;is&nbsp;ever&nbsp;to&nbsp;match&nbsp;that&nbsp;branch.&nbsp;If&nbsp;all&nbsp;possible&nbsp;alter-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;natives&nbsp;start&nbsp;with&nbsp;a&nbsp;circumflex,&nbsp;that&nbsp;is,&nbsp;if&nbsp;the&nbsp;pattern&nbsp;&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constrained&nbsp;to&nbsp;match&nbsp;only&nbsp;at&nbsp;the&nbsp;start&nbsp;of&nbsp;the&nbsp;subject,&nbsp;it&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;said&nbsp;to&nbsp;be&nbsp;an&nbsp;"anchored"&nbsp;pattern.&nbsp;(There&nbsp;are&nbsp;also&nbsp;other&nbsp;con-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;structs&nbsp;that&nbsp;can&nbsp;cause&nbsp;a&nbsp;pattern&nbsp;to&nbsp;be&nbsp;anchored.)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;dollar&nbsp;character&nbsp;is&nbsp;an&nbsp;assertion&nbsp;which&nbsp;is&nbsp;<TT
CLASS="constant"
><B
>TRUE</B
></TT
>&nbsp;only&nbsp;if&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;&nbsp;matching&nbsp;point&nbsp;is&nbsp;at&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;subject&nbsp;string,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;immediately&nbsp;before&nbsp;a&nbsp;newline&nbsp;character&nbsp;that&nbsp;is&nbsp;&nbsp;the&nbsp;&nbsp;last<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;character&nbsp;in&nbsp;the&nbsp;string&nbsp;(by&nbsp;default).&nbsp;Dollar&nbsp;need&nbsp;not&nbsp;be&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;character&nbsp;of&nbsp;the&nbsp;pattern&nbsp;if&nbsp;a&nbsp;&nbsp;number&nbsp;&nbsp;of&nbsp;&nbsp;alternatives<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;are&nbsp;&nbsp;involved,&nbsp;&nbsp;but&nbsp;it&nbsp;should&nbsp;be&nbsp;the&nbsp;last&nbsp;item&nbsp;in&nbsp;any&nbsp;branch<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;which&nbsp;it&nbsp;appears.&nbsp;&nbsp;Dollar&nbsp;has&nbsp;no&nbsp;&nbsp;special&nbsp;&nbsp;meaning&nbsp;&nbsp;in&nbsp;&nbsp;a<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;character&nbsp;class.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;meaning&nbsp;of&nbsp;dollar&nbsp;can&nbsp;be&nbsp;changed&nbsp;so&nbsp;that&nbsp;it&nbsp;matches&nbsp;only<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;very&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;string,&nbsp;&nbsp;by&nbsp;&nbsp;setting&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_DOLLAR_ENDONLY</A
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;option&nbsp;at&nbsp;compile&nbsp;or&nbsp;matching&nbsp;time.&nbsp;This<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;does&nbsp;not&nbsp;affect&nbsp;the&nbsp;\Z&nbsp;assertion.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;meanings&nbsp;of&nbsp;the&nbsp;circumflex&nbsp;&nbsp;and&nbsp;&nbsp;dollar&nbsp;&nbsp;characters&nbsp;&nbsp;are<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changed&nbsp;&nbsp;if&nbsp;&nbsp;the&nbsp;&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_MULTILINE</A
>&nbsp;&nbsp;option&nbsp;is&nbsp;set.&nbsp;When&nbsp;this&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;case,&nbsp;&nbsp;they&nbsp;&nbsp;match&nbsp;&nbsp;immediately&nbsp;&nbsp;after&nbsp;&nbsp;and&nbsp;&nbsp;immediately<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;before&nbsp;an&nbsp;internal&nbsp;"\n"&nbsp;character,&nbsp;respectively,&nbsp;in&nbsp;addition<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;matching&nbsp;at&nbsp;the&nbsp;start&nbsp;and&nbsp;end&nbsp;of&nbsp;the&nbsp;subject&nbsp;string.&nbsp;&nbsp;For<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;example,&nbsp;&nbsp;the&nbsp;&nbsp;pattern&nbsp;&nbsp;/^abc$/&nbsp;&nbsp;matches&nbsp;&nbsp;the&nbsp;subject&nbsp;string<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"def\nabc"&nbsp;in&nbsp;multiline&nbsp;&nbsp;mode,&nbsp;&nbsp;but&nbsp;&nbsp;not&nbsp;&nbsp;otherwise.&nbsp;&nbsp;Conse-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quently,&nbsp;&nbsp;patterns&nbsp;&nbsp;that&nbsp;&nbsp;are&nbsp;&nbsp;anchored&nbsp;&nbsp;in&nbsp;single&nbsp;line&nbsp;mode<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;because&nbsp;all&nbsp;branches&nbsp;start&nbsp;with&nbsp;"^"&nbsp;are&nbsp;not&nbsp;anchored&nbsp;in&nbsp;mul-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tiline&nbsp;&nbsp;mode.&nbsp;&nbsp;The&nbsp;&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_DOLLAR_ENDONLY</A
>&nbsp;&nbsp;option&nbsp;is&nbsp;ignored&nbsp;if<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_MULTILINE</A
>&nbsp;&nbsp;is&nbsp;set.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Note&nbsp;that&nbsp;the&nbsp;sequences&nbsp;\A,&nbsp;\Z,&nbsp;and&nbsp;\z&nbsp;can&nbsp;be&nbsp;used&nbsp;to&nbsp;&nbsp;match<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;start&nbsp;&nbsp;and&nbsp;end&nbsp;of&nbsp;the&nbsp;subject&nbsp;in&nbsp;both&nbsp;modes,&nbsp;and&nbsp;if&nbsp;all<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;branches&nbsp;of&nbsp;a&nbsp;pattern&nbsp;start&nbsp;with&nbsp;\A&nbsp;is&nbsp;it&nbsp;&nbsp;always&nbsp;&nbsp;anchored,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whether&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_MULTILINE</A
>&nbsp;&nbsp;is&nbsp;set&nbsp;or&nbsp;not.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.dot"
></A
><H3
>FULL STOP</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Outside&nbsp;a&nbsp;character&nbsp;class,&nbsp;a&nbsp;dot&nbsp;in&nbsp;the&nbsp;pattern&nbsp;matches&nbsp;&nbsp;any<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;one&nbsp;&nbsp;character&nbsp;&nbsp;in&nbsp;&nbsp;the&nbsp;&nbsp;subject,&nbsp;&nbsp;including&nbsp;&nbsp;a&nbsp;non-printing<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;character,&nbsp;but&nbsp;not&nbsp;(by&nbsp;default)&nbsp;newline.&nbsp;&nbsp;If&nbsp;the&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_DOTALL</A
>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;option&nbsp;&nbsp;is&nbsp;&nbsp;set,&nbsp;&nbsp;then&nbsp;dots&nbsp;match&nbsp;newlines&nbsp;as&nbsp;well.&nbsp;The&nbsp;han-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dling&nbsp;of&nbsp;dot&nbsp;is&nbsp;entirely&nbsp;independent&nbsp;of&nbsp;the&nbsp;handling&nbsp;of&nbsp;cir-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cumflex&nbsp;&nbsp;and&nbsp;&nbsp;dollar,&nbsp;&nbsp;the&nbsp;only&nbsp;relationship&nbsp;being&nbsp;that&nbsp;they<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;both&nbsp;involve&nbsp;newline&nbsp;characters.&nbsp;&nbsp;Dot&nbsp;has&nbsp;no&nbsp;special&nbsp;meaning<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;a&nbsp;character&nbsp;class.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.squarebrackets"
></A
><H3
>Square brackets</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;An&nbsp;opening&nbsp;square&nbsp;bracket&nbsp;introduces&nbsp;a&nbsp;character&nbsp;class,&nbsp;ter-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minated&nbsp;&nbsp;by&nbsp;&nbsp;a&nbsp;&nbsp;closing&nbsp;&nbsp;square&nbsp;&nbsp;bracket.&nbsp;&nbsp;A&nbsp;&nbsp;closing&nbsp;square<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bracket&nbsp;on&nbsp;its&nbsp;own&nbsp;is&nbsp;&nbsp;not&nbsp;&nbsp;special.&nbsp;&nbsp;If&nbsp;&nbsp;a&nbsp;&nbsp;closing&nbsp;&nbsp;square<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bracket&nbsp;&nbsp;is&nbsp;&nbsp;required&nbsp;as&nbsp;a&nbsp;member&nbsp;of&nbsp;the&nbsp;class,&nbsp;it&nbsp;should&nbsp;be<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;first&nbsp;data&nbsp;character&nbsp;in&nbsp;the&nbsp;class&nbsp;(after&nbsp;an&nbsp;initial&nbsp;cir-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cumflex,&nbsp;if&nbsp;present)&nbsp;or&nbsp;escaped&nbsp;with&nbsp;a&nbsp;backslash.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;character&nbsp;class&nbsp;matches&nbsp;a&nbsp;single&nbsp;character&nbsp;in&nbsp;the&nbsp;subject;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;character&nbsp;&nbsp;must&nbsp;&nbsp;be&nbsp;in&nbsp;the&nbsp;set&nbsp;of&nbsp;characters&nbsp;defined&nbsp;by<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;class,&nbsp;unless&nbsp;the&nbsp;first&nbsp;character&nbsp;in&nbsp;the&nbsp;class&nbsp;is&nbsp;a&nbsp;cir-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cumflex,&nbsp;&nbsp;in&nbsp;which&nbsp;case&nbsp;the&nbsp;subject&nbsp;character&nbsp;must&nbsp;not&nbsp;be&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;set&nbsp;defined&nbsp;by&nbsp;the&nbsp;class.&nbsp;If&nbsp;a&nbsp;&nbsp;circumflex&nbsp;&nbsp;is&nbsp;&nbsp;actually<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required&nbsp;&nbsp;as&nbsp;&nbsp;a&nbsp;&nbsp;member&nbsp;&nbsp;of&nbsp;&nbsp;the&nbsp;class,&nbsp;ensure&nbsp;it&nbsp;is&nbsp;not&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;character,&nbsp;or&nbsp;escape&nbsp;it&nbsp;with&nbsp;a&nbsp;backslash.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;example,&nbsp;the&nbsp;character&nbsp;class&nbsp;[aeiou]&nbsp;matches&nbsp;&nbsp;any&nbsp;&nbsp;lower<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;vowel,&nbsp;while&nbsp;[^aeiou]&nbsp;matches&nbsp;any&nbsp;character&nbsp;that&nbsp;is&nbsp;not<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;lower&nbsp;case&nbsp;vowel.&nbsp;Note&nbsp;that&nbsp;a&nbsp;circumflex&nbsp;is&nbsp;&nbsp;just&nbsp;&nbsp;a&nbsp;&nbsp;con-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;venient&nbsp;&nbsp;notation&nbsp;for&nbsp;specifying&nbsp;the&nbsp;characters&nbsp;which&nbsp;are&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;class&nbsp;by&nbsp;enumerating&nbsp;those&nbsp;that&nbsp;are&nbsp;not.&nbsp;It&nbsp;&nbsp;is&nbsp;&nbsp;not&nbsp;&nbsp;an<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertion:&nbsp;&nbsp;it&nbsp;&nbsp;still&nbsp;&nbsp;consumes&nbsp;a&nbsp;character&nbsp;from&nbsp;the&nbsp;subject<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string,&nbsp;and&nbsp;fails&nbsp;if&nbsp;the&nbsp;current&nbsp;pointer&nbsp;is&nbsp;at&nbsp;&nbsp;the&nbsp;&nbsp;end&nbsp;&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;string.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;When&nbsp;caseless&nbsp;matching&nbsp;&nbsp;is&nbsp;&nbsp;set,&nbsp;&nbsp;any&nbsp;&nbsp;letters&nbsp;&nbsp;in&nbsp;&nbsp;a&nbsp;&nbsp;class<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;represent&nbsp;&nbsp;both&nbsp;their&nbsp;upper&nbsp;case&nbsp;and&nbsp;lower&nbsp;case&nbsp;versions,&nbsp;so<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;example,&nbsp;a&nbsp;caseless&nbsp;[aeiou]&nbsp;matches&nbsp;"A"&nbsp;as&nbsp;well&nbsp;as&nbsp;&nbsp;"a",<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;a&nbsp;caseless&nbsp;[^aeiou]&nbsp;does&nbsp;not&nbsp;match&nbsp;"A",&nbsp;whereas&nbsp;a&nbsp;case-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ful&nbsp;version&nbsp;would.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;newline&nbsp;character&nbsp;is&nbsp;never&nbsp;treated&nbsp;in&nbsp;any&nbsp;special&nbsp;way&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;character&nbsp;&nbsp;classes,&nbsp;&nbsp;whatever&nbsp;the&nbsp;setting&nbsp;of&nbsp;the&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_DOTALL</A
>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_MULTILINE</A
>&nbsp;&nbsp;options&nbsp;is.&nbsp;A&nbsp;&nbsp;class&nbsp;&nbsp;such&nbsp;&nbsp;as&nbsp;&nbsp;[^a]&nbsp;&nbsp;will<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;always&nbsp;match&nbsp;a&nbsp;newline.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;minus&nbsp;(hyphen)&nbsp;character&nbsp;can&nbsp;be&nbsp;used&nbsp;to&nbsp;specify&nbsp;a&nbsp;&nbsp;range<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;characters&nbsp;&nbsp;in&nbsp;&nbsp;a&nbsp;&nbsp;character&nbsp;&nbsp;class.&nbsp;&nbsp;For&nbsp;example,&nbsp;[d-m]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;any&nbsp;letter&nbsp;between&nbsp;d&nbsp;and&nbsp;m,&nbsp;inclusive.&nbsp;&nbsp;If&nbsp;&nbsp;a&nbsp;&nbsp;minus<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;character&nbsp;&nbsp;is&nbsp;required&nbsp;in&nbsp;a&nbsp;class,&nbsp;it&nbsp;must&nbsp;be&nbsp;escaped&nbsp;with&nbsp;a<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backslash&nbsp;or&nbsp;appear&nbsp;in&nbsp;a&nbsp;position&nbsp;where&nbsp;it&nbsp;cannot&nbsp;be&nbsp;&nbsp;inter-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preted&nbsp;as&nbsp;indicating&nbsp;a&nbsp;range,&nbsp;typically&nbsp;as&nbsp;the&nbsp;first&nbsp;or&nbsp;last<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;character&nbsp;in&nbsp;the&nbsp;class.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;It&nbsp;is&nbsp;not&nbsp;possible&nbsp;to&nbsp;have&nbsp;the&nbsp;literal&nbsp;character&nbsp;"]"&nbsp;as&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;character&nbsp;&nbsp;of&nbsp;&nbsp;a&nbsp;&nbsp;range.&nbsp;&nbsp;A&nbsp;&nbsp;pattern&nbsp;such&nbsp;as&nbsp;[W-]46]&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interpreted&nbsp;as&nbsp;a&nbsp;class&nbsp;of&nbsp;two&nbsp;characters&nbsp;("W"&nbsp;and&nbsp;"-")&nbsp;&nbsp;fol-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lowed&nbsp;by&nbsp;a&nbsp;literal&nbsp;string&nbsp;"46]",&nbsp;so&nbsp;it&nbsp;would&nbsp;match&nbsp;"W46]"&nbsp;or<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"-46]".&nbsp;However,&nbsp;if&nbsp;the&nbsp;"]"&nbsp;is&nbsp;escaped&nbsp;with&nbsp;a&nbsp;&nbsp;backslash&nbsp;&nbsp;it<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;interpreted&nbsp;&nbsp;as&nbsp;&nbsp;the&nbsp;end&nbsp;of&nbsp;range,&nbsp;so&nbsp;[W-\]46]&nbsp;is&nbsp;inter-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preted&nbsp;as&nbsp;a&nbsp;single&nbsp;class&nbsp;containing&nbsp;a&nbsp;range&nbsp;followed&nbsp;by&nbsp;&nbsp;two<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;separate&nbsp;characters.&nbsp;The&nbsp;octal&nbsp;or&nbsp;hexadecimal&nbsp;representation<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;"]"&nbsp;can&nbsp;also&nbsp;be&nbsp;used&nbsp;to&nbsp;end&nbsp;a&nbsp;range.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ranges&nbsp;operate&nbsp;in&nbsp;ASCII&nbsp;collating&nbsp;sequence.&nbsp;They&nbsp;can&nbsp;also&nbsp;be<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used&nbsp;&nbsp;for&nbsp;&nbsp;characters&nbsp;&nbsp;specified&nbsp;&nbsp;numerically,&nbsp;&nbsp;for&nbsp;&nbsp;example<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[\000-\037].&nbsp;If&nbsp;a&nbsp;range&nbsp;that&nbsp;includes&nbsp;letters&nbsp;is&nbsp;&nbsp;used&nbsp;&nbsp;when<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;caseless&nbsp;&nbsp;matching&nbsp;&nbsp;is&nbsp;set,&nbsp;it&nbsp;matches&nbsp;the&nbsp;letters&nbsp;in&nbsp;either<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case.&nbsp;For&nbsp;example,&nbsp;[W-c]&nbsp;is&nbsp;equivalent&nbsp;&nbsp;to&nbsp;&nbsp;[][\^_`wxyzabc],<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matched&nbsp;&nbsp;caselessly,&nbsp;&nbsp;and&nbsp;&nbsp;if&nbsp;&nbsp;character&nbsp;tables&nbsp;for&nbsp;the&nbsp;"fr"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locale&nbsp;are&nbsp;in&nbsp;use,&nbsp;[\xc8-\xcb]&nbsp;matches&nbsp;accented&nbsp;E&nbsp;characters<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;both&nbsp;cases.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;character&nbsp;types&nbsp;\d,&nbsp;\D,&nbsp;\s,&nbsp;\S,&nbsp;&nbsp;\w,&nbsp;&nbsp;and&nbsp;&nbsp;\W&nbsp;&nbsp;may&nbsp;&nbsp;also<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appear&nbsp;&nbsp;in&nbsp;&nbsp;a&nbsp;&nbsp;character&nbsp;&nbsp;class,&nbsp;and&nbsp;add&nbsp;the&nbsp;characters&nbsp;that<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;they&nbsp;match&nbsp;to&nbsp;the&nbsp;class.&nbsp;For&nbsp;example,&nbsp;[\dABCDEF]&nbsp;matches&nbsp;any<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hexadecimal&nbsp;&nbsp;digit.&nbsp;&nbsp;A&nbsp;&nbsp;circumflex&nbsp;&nbsp;can&nbsp;conveniently&nbsp;be&nbsp;used<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;the&nbsp;upper&nbsp;case&nbsp;character&nbsp;types&nbsp;to&nbsp;specify&nbsp;a&nbsp;&nbsp;more&nbsp;&nbsp;res-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tricted&nbsp;set&nbsp;of&nbsp;characters&nbsp;than&nbsp;the&nbsp;matching&nbsp;lower&nbsp;case&nbsp;type.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;example,&nbsp;the&nbsp;class&nbsp;[^\W_]&nbsp;matches&nbsp;any&nbsp;letter&nbsp;&nbsp;or&nbsp;&nbsp;digit,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;but&nbsp;not&nbsp;underscore.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;All&nbsp;non-alphanumeric&nbsp;characters&nbsp;other&nbsp;than&nbsp;\,&nbsp;&nbsp;-,&nbsp;&nbsp;^&nbsp;&nbsp;(at&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start)&nbsp;&nbsp;and&nbsp;&nbsp;the&nbsp;&nbsp;terminating&nbsp;]&nbsp;are&nbsp;non-special&nbsp;in&nbsp;character<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classes,&nbsp;but&nbsp;it&nbsp;does&nbsp;no&nbsp;harm&nbsp;if&nbsp;they&nbsp;are&nbsp;escaped.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.verticalbar"
></A
><H3
>Vertical bar</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vertical&nbsp;bar&nbsp;characters&nbsp;are&nbsp;&nbsp;used&nbsp;&nbsp;to&nbsp;&nbsp;separate&nbsp;&nbsp;alternative<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;patterns.&nbsp;For&nbsp;example,&nbsp;the&nbsp;pattern<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gilbert|sullivan<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;either&nbsp;"gilbert"&nbsp;or&nbsp;"sullivan".&nbsp;Any&nbsp;number&nbsp;of&nbsp;alternatives<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;may&nbsp;&nbsp;appear,&nbsp;&nbsp;and&nbsp;an&nbsp;empty&nbsp;alternative&nbsp;is&nbsp;permitted<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(matching&nbsp;the&nbsp;empty&nbsp;string).&nbsp;&nbsp;&nbsp;The&nbsp;&nbsp;matching&nbsp;&nbsp;process&nbsp;&nbsp;tries<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;each&nbsp;&nbsp;alternative&nbsp;in&nbsp;turn,&nbsp;from&nbsp;left&nbsp;to&nbsp;right,&nbsp;and&nbsp;the&nbsp;first<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;one&nbsp;that&nbsp;succeeds&nbsp;is&nbsp;used.&nbsp;If&nbsp;the&nbsp;alternatives&nbsp;are&nbsp;within&nbsp;&nbsp;a<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subpattern&nbsp;&nbsp;(defined&nbsp;&nbsp;below),&nbsp;&nbsp;"succeeds"&nbsp;means&nbsp;matching&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rest&nbsp;of&nbsp;the&nbsp;main&nbsp;pattern&nbsp;as&nbsp;well&nbsp;as&nbsp;the&nbsp;alternative&nbsp;&nbsp;in&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subpattern.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.internal-options"
></A
><H3
>Internal option setting</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;settings&nbsp;of&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_CASELESS</A
>&nbsp;,&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_MULTILINE</A
>&nbsp;,&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_DOTALL</A
>&nbsp;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_EXTENDED</A
>&nbsp;&nbsp;can&nbsp;be&nbsp;changed&nbsp;from&nbsp;within&nbsp;the&nbsp;pattern&nbsp;by<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;sequence&nbsp;of&nbsp;Perl&nbsp;option&nbsp;letters&nbsp;enclosed&nbsp;between&nbsp;"(?"&nbsp;&nbsp;and<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")".&nbsp;The&nbsp;option&nbsp;letters&nbsp;are<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;for&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_CASELESS</A
>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;&nbsp;for&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_MULTILINE</A
>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;&nbsp;for&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_DOTALL</A
>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;&nbsp;for&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_EXTENDED</A
>&nbsp;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;example,&nbsp;(?im)&nbsp;sets&nbsp;caseless,&nbsp;multiline&nbsp;matching.&nbsp;It&nbsp;&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;also&nbsp;possible&nbsp;to&nbsp;unset&nbsp;these&nbsp;options&nbsp;by&nbsp;preceding&nbsp;the&nbsp;letter<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;a&nbsp;hyphen,&nbsp;and&nbsp;a&nbsp;combined&nbsp;setting&nbsp;and&nbsp;unsetting&nbsp;such&nbsp;&nbsp;as<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?im-sx),&nbsp;&nbsp;which&nbsp;sets&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_CASELESS</A
>&nbsp;&nbsp;and&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_MULTILINE</A
>&nbsp;&nbsp;while<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsetting&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_DOTALL</A
>&nbsp;&nbsp;and&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_EXTENDED</A
>&nbsp;,&nbsp;is&nbsp;also&nbsp;&nbsp;permitted.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;&nbsp;a&nbsp;&nbsp;letter&nbsp;&nbsp;appears&nbsp;both&nbsp;before&nbsp;and&nbsp;after&nbsp;the&nbsp;hyphen,&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;option&nbsp;is&nbsp;unset.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;scope&nbsp;of&nbsp;these&nbsp;option&nbsp;changes&nbsp;depends&nbsp;on&nbsp;&nbsp;where&nbsp;&nbsp;in&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern&nbsp;&nbsp;the&nbsp;&nbsp;setting&nbsp;&nbsp;occurs.&nbsp;For&nbsp;settings&nbsp;that&nbsp;are&nbsp;outside<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;any&nbsp;subpattern&nbsp;(defined&nbsp;below),&nbsp;the&nbsp;effect&nbsp;is&nbsp;the&nbsp;same&nbsp;as&nbsp;if<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;options&nbsp;were&nbsp;set&nbsp;or&nbsp;unset&nbsp;at&nbsp;the&nbsp;start&nbsp;of&nbsp;matching.&nbsp;The<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;following&nbsp;patterns&nbsp;all&nbsp;behave&nbsp;in&nbsp;exactly&nbsp;the&nbsp;same&nbsp;way:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?i)abc<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a(?i)bc<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ab(?i)c<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abc(?i)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;which&nbsp;in&nbsp;turn&nbsp;is&nbsp;the&nbsp;same&nbsp;as&nbsp;compiling&nbsp;the&nbsp;pattern&nbsp;abc&nbsp;&nbsp;with<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_CASELESS</A
>&nbsp;set.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;In&nbsp;&nbsp;other&nbsp;words,&nbsp;such&nbsp;"top&nbsp;level"&nbsp;settings&nbsp;apply&nbsp;to&nbsp;the&nbsp;whole<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern&nbsp;&nbsp;(unless&nbsp;&nbsp;there&nbsp;&nbsp;are&nbsp;&nbsp;other&nbsp;changes&nbsp;&nbsp;inside&nbsp;subpatterns).<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;there&nbsp;is&nbsp;more&nbsp;than&nbsp;one&nbsp;setting&nbsp;of&nbsp;the&nbsp;same&nbsp;option&nbsp;at&nbsp;top&nbsp;level,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;rightmost&nbsp;&nbsp;setting&nbsp;is&nbsp;used.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;an&nbsp;option&nbsp;change&nbsp;occurs&nbsp;inside&nbsp;a&nbsp;subpattern,&nbsp;&nbsp;the&nbsp;&nbsp;effect<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;different.&nbsp;&nbsp;This&nbsp;is&nbsp;a&nbsp;change&nbsp;of&nbsp;behaviour&nbsp;in&nbsp;Perl&nbsp;5.005.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;An&nbsp;option&nbsp;change&nbsp;inside&nbsp;a&nbsp;subpattern&nbsp;affects&nbsp;only&nbsp;that&nbsp;&nbsp;part<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;the&nbsp;subpattern&nbsp;that&nbsp;follows&nbsp;it,&nbsp;so<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a(?i)b)c<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;&nbsp;abc&nbsp;&nbsp;and&nbsp;&nbsp;aBc&nbsp;&nbsp;and&nbsp;&nbsp;no&nbsp;&nbsp;other&nbsp;&nbsp;&nbsp;strings&nbsp;&nbsp;&nbsp;(assuming<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_CASELESS</A
>&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;not&nbsp;used).&nbsp;&nbsp;By&nbsp;this&nbsp;means,&nbsp;options&nbsp;can&nbsp;be<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;made&nbsp;to&nbsp;have&nbsp;different&nbsp;settings&nbsp;in&nbsp;different&nbsp;&nbsp;parts&nbsp;&nbsp;of&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern.&nbsp;&nbsp;Any&nbsp;&nbsp;changes&nbsp;&nbsp;made&nbsp;&nbsp;in&nbsp;one&nbsp;alternative&nbsp;do&nbsp;carry&nbsp;on<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;into&nbsp;subsequent&nbsp;branches&nbsp;within&nbsp;&nbsp;the&nbsp;&nbsp;same&nbsp;&nbsp;subpattern.&nbsp;&nbsp;For<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;example,<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a(?i)b|c)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;"ab",&nbsp;"aB",&nbsp;"c",&nbsp;and&nbsp;"C",&nbsp;even&nbsp;though&nbsp;when&nbsp;&nbsp;matching<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"C"&nbsp;the&nbsp;first&nbsp;branch&nbsp;is&nbsp;abandoned&nbsp;before&nbsp;the&nbsp;option&nbsp;setting.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;is&nbsp;because&nbsp;the&nbsp;effects&nbsp;of&nbsp;&nbsp;option&nbsp;&nbsp;settings&nbsp;&nbsp;happen&nbsp;&nbsp;at<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compile&nbsp;&nbsp;time.&nbsp;There&nbsp;would&nbsp;be&nbsp;some&nbsp;very&nbsp;weird&nbsp;behaviour&nbsp;otherwise.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;PCRE-specific&nbsp;options&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_UNGREEDY</A
>&nbsp;&nbsp;and&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_EXTRA</A
>&nbsp;&nbsp;&nbsp;can<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be&nbsp;changed&nbsp;in&nbsp;the&nbsp;same&nbsp;way&nbsp;as&nbsp;the&nbsp;Perl-compatible&nbsp;options&nbsp;by<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;the&nbsp;characters&nbsp;U&nbsp;and&nbsp;X&nbsp;&nbsp;respectively.&nbsp;&nbsp;The&nbsp;&nbsp;(?X)&nbsp;&nbsp;flag<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setting&nbsp;&nbsp;is&nbsp;&nbsp;special&nbsp;in&nbsp;that&nbsp;it&nbsp;must&nbsp;always&nbsp;occur&nbsp;earlier&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;pattern&nbsp;than&nbsp;any&nbsp;of&nbsp;the&nbsp;additional&nbsp;features&nbsp;it&nbsp;turns&nbsp;on,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;even&nbsp;when&nbsp;it&nbsp;is&nbsp;at&nbsp;top&nbsp;level.&nbsp;It&nbsp;is&nbsp;best&nbsp;put&nbsp;at&nbsp;the&nbsp;start.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.subpatterns"
></A
><H3
>subpatterns</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subpatterns&nbsp;are&nbsp;delimited&nbsp;by&nbsp;parentheses&nbsp;&nbsp;(round&nbsp;&nbsp;brackets),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;which&nbsp;can&nbsp;be&nbsp;nested.&nbsp;&nbsp;Marking&nbsp;part&nbsp;of&nbsp;a&nbsp;pattern&nbsp;as&nbsp;a&nbsp;subpattern<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;does&nbsp;two&nbsp;things:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;It&nbsp;localizes&nbsp;a&nbsp;set&nbsp;of&nbsp;alternatives.&nbsp;For&nbsp;example,&nbsp;the&nbsp;pat-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tern<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat(aract|erpillar|)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;one&nbsp;of&nbsp;the&nbsp;words&nbsp;"cat",&nbsp;&nbsp;"cataract",&nbsp;&nbsp;or&nbsp;&nbsp;"caterpillar".<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Without&nbsp;&nbsp;the&nbsp;&nbsp;parentheses,&nbsp;it&nbsp;would&nbsp;match&nbsp;"cataract",<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"erpillar"&nbsp;or&nbsp;the&nbsp;empty&nbsp;string.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;It&nbsp;sets&nbsp;up&nbsp;the&nbsp;subpattern&nbsp;as&nbsp;a&nbsp;capturing&nbsp;&nbsp;subpattern&nbsp;&nbsp;(as<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defined&nbsp;&nbsp;above).&nbsp;&nbsp;&nbsp;When&nbsp;the&nbsp;whole&nbsp;pattern&nbsp;matches,&nbsp;that&nbsp;portion<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;the&nbsp;subject&nbsp;string&nbsp;that&nbsp;matched&nbsp;&nbsp;the&nbsp;&nbsp;subpattern&nbsp;&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;passed&nbsp;&nbsp;back&nbsp;&nbsp;to&nbsp;&nbsp;the&nbsp;&nbsp;caller&nbsp;&nbsp;via&nbsp;&nbsp;the&nbsp;&nbsp;<SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>ovector</I
></SPAN
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argument&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<B
CLASS="function"
>pcre_exec()</B
>.&nbsp;Opening&nbsp;parentheses&nbsp;are&nbsp;counted<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;&nbsp;left&nbsp;&nbsp;to&nbsp;right&nbsp;(starting&nbsp;from&nbsp;1)&nbsp;to&nbsp;obtain&nbsp;the&nbsp;numbers&nbsp;of&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;capturing&nbsp;subpatterns.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;example,&nbsp;if&nbsp;the&nbsp;string&nbsp;"the&nbsp;red&nbsp;king"&nbsp;is&nbsp;matched&nbsp;against<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;pattern<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;((red|white)&nbsp;(king|queen))<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;captured&nbsp;substrings&nbsp;are&nbsp;"red&nbsp;king",&nbsp;"red",&nbsp;&nbsp;and&nbsp;&nbsp;"king",<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;are&nbsp;numbered&nbsp;1,&nbsp;2,&nbsp;and&nbsp;3.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;fact&nbsp;that&nbsp;plain&nbsp;parentheses&nbsp;fulfil&nbsp;two&nbsp;functions&nbsp;is&nbsp;&nbsp;not<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;always&nbsp;&nbsp;helpful.&nbsp;&nbsp;There&nbsp;are&nbsp;often&nbsp;times&nbsp;when&nbsp;a&nbsp;grouping&nbsp;subpattern<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;required&nbsp;without&nbsp;a&nbsp;capturing&nbsp;requirement.&nbsp;&nbsp;If&nbsp;&nbsp;an<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opening&nbsp;parenthesis&nbsp;is&nbsp;followed&nbsp;by&nbsp;"?:",&nbsp;the&nbsp;subpattern&nbsp;does<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;do&nbsp;any&nbsp;capturing,&nbsp;and&nbsp;is&nbsp;not&nbsp;counted&nbsp;when&nbsp;computing&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number&nbsp;of&nbsp;any&nbsp;subsequent&nbsp;capturing&nbsp;subpatterns.&nbsp;For&nbsp;example,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;the&nbsp;string&nbsp;"the&nbsp;&nbsp;white&nbsp;&nbsp;queen"&nbsp;&nbsp;is&nbsp;&nbsp;matched&nbsp;&nbsp;against&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;((?:red|white)&nbsp;(king|queen))<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;captured&nbsp;substrings&nbsp;are&nbsp;"white&nbsp;queen"&nbsp;and&nbsp;&nbsp;"queen",&nbsp;&nbsp;and<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;are&nbsp;&nbsp;numbered&nbsp;&nbsp;1&nbsp;&nbsp;and&nbsp;2.&nbsp;The&nbsp;maximum&nbsp;number&nbsp;of&nbsp;captured&nbsp;substrings<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;99,&nbsp;and&nbsp;the&nbsp;maximum&nbsp;number&nbsp;&nbsp;of&nbsp;&nbsp;all&nbsp;&nbsp;subpatterns,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;both&nbsp;capturing&nbsp;and&nbsp;non-capturing,&nbsp;is&nbsp;200.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As&nbsp;a&nbsp;&nbsp;convenient&nbsp;&nbsp;shorthand,&nbsp;&nbsp;if&nbsp;&nbsp;any&nbsp;&nbsp;option&nbsp;&nbsp;settings&nbsp;&nbsp;are<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required&nbsp;&nbsp;at&nbsp;&nbsp;the&nbsp;&nbsp;start&nbsp;&nbsp;of&nbsp;a&nbsp;non-capturing&nbsp;subpattern,&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;option&nbsp;letters&nbsp;may&nbsp;appear&nbsp;between&nbsp;the&nbsp;"?"&nbsp;and&nbsp;the&nbsp;":".&nbsp;&nbsp;Thus<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;two&nbsp;patterns<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?i:saturday|sunday)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?:(?i)saturday|sunday)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match&nbsp;exactly&nbsp;the&nbsp;same&nbsp;set&nbsp;of&nbsp;strings.&nbsp;&nbsp;Because&nbsp;&nbsp;alternative<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;branches&nbsp;&nbsp;are&nbsp;&nbsp;tried&nbsp;from&nbsp;left&nbsp;to&nbsp;right,&nbsp;and&nbsp;options&nbsp;are&nbsp;not<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reset&nbsp;until&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;subpattern&nbsp;is&nbsp;reached,&nbsp;an&nbsp;&nbsp;option<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setting&nbsp;&nbsp;in&nbsp;&nbsp;one&nbsp;&nbsp;branch&nbsp;does&nbsp;affect&nbsp;subsequent&nbsp;branches,&nbsp;so<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;above&nbsp;patterns&nbsp;match&nbsp;"SUNDAY"&nbsp;as&nbsp;well&nbsp;as&nbsp;"Saturday".<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.repetition"
></A
><H3
>Repetition</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Repetition&nbsp;is&nbsp;specified&nbsp;by&nbsp;quantifiers,&nbsp;which&nbsp;can&nbsp;follow&nbsp;any<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;the&nbsp;following&nbsp;items:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;single&nbsp;character,&nbsp;possibly&nbsp;escaped<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;.&nbsp;metacharacter<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;character&nbsp;class<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;back&nbsp;reference&nbsp;(see&nbsp;next&nbsp;section)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;parenthesized&nbsp;subpattern&nbsp;(unless&nbsp;it&nbsp;is&nbsp;&nbsp;an&nbsp;&nbsp;assertion&nbsp;&nbsp;-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;see&nbsp;below)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;general&nbsp;repetition&nbsp;quantifier&nbsp;specifies&nbsp;&nbsp;a&nbsp;&nbsp;minimum&nbsp;&nbsp;and<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maximum&nbsp;&nbsp;number&nbsp;&nbsp;of&nbsp;&nbsp;permitted&nbsp;&nbsp;matches,&nbsp;&nbsp;by&nbsp;&nbsp;giving&nbsp;the&nbsp;two<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numbers&nbsp;in&nbsp;curly&nbsp;brackets&nbsp;(braces),&nbsp;separated&nbsp;&nbsp;by&nbsp;&nbsp;a&nbsp;&nbsp;comma.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;&nbsp;numbers&nbsp;&nbsp;must&nbsp;be&nbsp;less&nbsp;than&nbsp;65536,&nbsp;and&nbsp;the&nbsp;first&nbsp;must&nbsp;be<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;less&nbsp;than&nbsp;or&nbsp;equal&nbsp;to&nbsp;the&nbsp;second.&nbsp;For&nbsp;example:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;z{2,4}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;"zz",&nbsp;"zzz",&nbsp;or&nbsp;"zzzz".&nbsp;A&nbsp;closing&nbsp;brace&nbsp;on&nbsp;&nbsp;its&nbsp;&nbsp;own<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;not&nbsp;a&nbsp;special&nbsp;character.&nbsp;If&nbsp;the&nbsp;second&nbsp;number&nbsp;is&nbsp;omitted,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;but&nbsp;the&nbsp;comma&nbsp;is&nbsp;present,&nbsp;there&nbsp;is&nbsp;no&nbsp;upper&nbsp;&nbsp;limit;&nbsp;&nbsp;if&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;second&nbsp;number&nbsp;and&nbsp;the&nbsp;comma&nbsp;are&nbsp;both&nbsp;omitted,&nbsp;the&nbsp;quantifier<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;specifies&nbsp;an&nbsp;exact&nbsp;number&nbsp;of&nbsp;required&nbsp;matches.&nbsp;Thus<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[aeiou]{3,}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;at&nbsp;least&nbsp;3&nbsp;successive&nbsp;vowels,&nbsp;&nbsp;but&nbsp;&nbsp;may&nbsp;&nbsp;match&nbsp;&nbsp;many<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;more,&nbsp;while<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\d{8}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;exactly&nbsp;8&nbsp;digits.&nbsp;&nbsp;An&nbsp;&nbsp;opening&nbsp;&nbsp;curly&nbsp;&nbsp;bracket&nbsp;&nbsp;that<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appears&nbsp;&nbsp;in&nbsp;a&nbsp;position&nbsp;where&nbsp;a&nbsp;quantifier&nbsp;is&nbsp;not&nbsp;allowed,&nbsp;or<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;one&nbsp;that&nbsp;does&nbsp;not&nbsp;match&nbsp;the&nbsp;syntax&nbsp;of&nbsp;a&nbsp;quantifier,&nbsp;is&nbsp;taken<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;as&nbsp;&nbsp;a&nbsp;literal&nbsp;character.&nbsp;For&nbsp;example,&nbsp;{,6}&nbsp;is&nbsp;not&nbsp;a&nbsp;quantifier,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;but&nbsp;a&nbsp;literal&nbsp;string&nbsp;of&nbsp;four&nbsp;characters.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;quantifier&nbsp;{0}&nbsp;is&nbsp;permitted,&nbsp;causing&nbsp;the&nbsp;&nbsp;expression&nbsp;&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;behave&nbsp;&nbsp;as&nbsp;&nbsp;if&nbsp;the&nbsp;previous&nbsp;item&nbsp;and&nbsp;the&nbsp;quantifier&nbsp;were&nbsp;not<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;present.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;convenience&nbsp;(and&nbsp;&nbsp;historical&nbsp;&nbsp;compatibility)&nbsp;&nbsp;the&nbsp;&nbsp;three<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;most&nbsp;common&nbsp;quantifiers&nbsp;have&nbsp;single-character&nbsp;abbreviations:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;equivalent&nbsp;to&nbsp;{0,}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;equivalent&nbsp;to&nbsp;{1,}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;equivalent&nbsp;to&nbsp;{0,1}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;It&nbsp;is&nbsp;possible&nbsp;to&nbsp;construct&nbsp;infinite&nbsp;loops&nbsp;&nbsp;by&nbsp;&nbsp;following&nbsp;&nbsp;a<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subpattern&nbsp;&nbsp;that&nbsp;&nbsp;can&nbsp;&nbsp;match&nbsp;no&nbsp;characters&nbsp;with&nbsp;a&nbsp;quantifier<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;has&nbsp;no&nbsp;upper&nbsp;limit,&nbsp;for&nbsp;example:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a?)*<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Earlier&nbsp;versions&nbsp;of&nbsp;Perl&nbsp;and&nbsp;PCRE&nbsp;used&nbsp;to&nbsp;give&nbsp;an&nbsp;&nbsp;error&nbsp;&nbsp;at<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compile&nbsp;&nbsp;time&nbsp;&nbsp;for&nbsp;such&nbsp;patterns.&nbsp;However,&nbsp;because&nbsp;there&nbsp;are<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cases&nbsp;where&nbsp;this&nbsp;&nbsp;can&nbsp;&nbsp;be&nbsp;&nbsp;useful,&nbsp;&nbsp;such&nbsp;&nbsp;patterns&nbsp;&nbsp;are&nbsp;&nbsp;now<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;accepted,&nbsp;&nbsp;but&nbsp;&nbsp;if&nbsp;&nbsp;any&nbsp;repetition&nbsp;of&nbsp;the&nbsp;subpattern&nbsp;does&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fact&nbsp;match&nbsp;no&nbsp;characters,&nbsp;the&nbsp;loop&nbsp;is&nbsp;forcibly&nbsp;broken.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By&nbsp;default,&nbsp;the&nbsp;quantifiers&nbsp;&nbsp;are&nbsp;&nbsp;"greedy",&nbsp;&nbsp;that&nbsp;&nbsp;is,&nbsp;&nbsp;they<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match&nbsp;&nbsp;as&nbsp;much&nbsp;as&nbsp;possible&nbsp;(up&nbsp;to&nbsp;the&nbsp;maximum&nbsp;number&nbsp;of&nbsp;permitted<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;times),&nbsp;without&nbsp;causing&nbsp;the&nbsp;rest&nbsp;of&nbsp;&nbsp;the&nbsp;&nbsp;pattern&nbsp;&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fail.&nbsp;The&nbsp;classic&nbsp;example&nbsp;of&nbsp;where&nbsp;this&nbsp;gives&nbsp;problems&nbsp;is&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trying&nbsp;to&nbsp;match&nbsp;comments&nbsp;in&nbsp;C&nbsp;programs.&nbsp;These&nbsp;appear&nbsp;between<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;sequences&nbsp;/*&nbsp;and&nbsp;*/&nbsp;and&nbsp;within&nbsp;the&nbsp;sequence,&nbsp;individual<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;and&nbsp;/&nbsp;characters&nbsp;may&nbsp;appear.&nbsp;An&nbsp;attempt&nbsp;to&nbsp;&nbsp;match&nbsp;&nbsp;C&nbsp;&nbsp;comments<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;by&nbsp;applying&nbsp;the&nbsp;pattern<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/\*.*\*/<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;the&nbsp;string<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;first&nbsp;command&nbsp;*/&nbsp;&nbsp;not&nbsp;comment&nbsp;&nbsp;/*&nbsp;second&nbsp;comment&nbsp;*/<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fails,&nbsp;because&nbsp;it&nbsp;matches&nbsp;&nbsp;the&nbsp;&nbsp;entire&nbsp;&nbsp;string&nbsp;&nbsp;due&nbsp;&nbsp;to&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;greediness&nbsp;of&nbsp;the&nbsp;.*&nbsp;&nbsp;item.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;However,&nbsp;if&nbsp;a&nbsp;quantifier&nbsp;is&nbsp;followed&nbsp;&nbsp;by&nbsp;&nbsp;a&nbsp;&nbsp;question&nbsp;&nbsp;mark,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;it&nbsp;ceases&nbsp;to&nbsp;be&nbsp;greedy,&nbsp;and&nbsp;instead&nbsp;matches&nbsp;the&nbsp;minimum<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number&nbsp;of&nbsp;times&nbsp;possible,&nbsp;so&nbsp;the&nbsp;pattern<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/\*.*?\*/<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;does&nbsp;the&nbsp;right&nbsp;thing&nbsp;with&nbsp;the&nbsp;C&nbsp;comments.&nbsp;The&nbsp;meaning&nbsp;of&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;various&nbsp;&nbsp;quantifiers&nbsp;is&nbsp;not&nbsp;otherwise&nbsp;changed,&nbsp;just&nbsp;the&nbsp;preferred<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number&nbsp;of&nbsp;matches.&nbsp;&nbsp;Do&nbsp;not&nbsp;confuse&nbsp;this&nbsp;use&nbsp;of&nbsp;&nbsp;ques-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tion&nbsp;&nbsp;mark&nbsp;&nbsp;with&nbsp;&nbsp;its&nbsp;&nbsp;use&nbsp;as&nbsp;a&nbsp;quantifier&nbsp;in&nbsp;its&nbsp;own&nbsp;right.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Because&nbsp;it&nbsp;has&nbsp;two&nbsp;uses,&nbsp;it&nbsp;can&nbsp;sometimes&nbsp;appear&nbsp;doubled,&nbsp;as<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\d??\d<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;which&nbsp;matches&nbsp;one&nbsp;digit&nbsp;by&nbsp;preference,&nbsp;but&nbsp;can&nbsp;match&nbsp;two&nbsp;&nbsp;if<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;is&nbsp;the&nbsp;only&nbsp;way&nbsp;the&nbsp;rest&nbsp;of&nbsp;the&nbsp;pattern&nbsp;matches.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;the&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_UNGREEDY</A
>&nbsp;&nbsp;option&nbsp;is&nbsp;set&nbsp;(an&nbsp;option&nbsp;which&nbsp;&nbsp;is&nbsp;&nbsp;not<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;available&nbsp;&nbsp;in&nbsp;&nbsp;Perl)&nbsp;&nbsp;then&nbsp;the&nbsp;quantifiers&nbsp;are&nbsp;not&nbsp;greedy&nbsp;by<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default,&nbsp;but&nbsp;individual&nbsp;ones&nbsp;can&nbsp;be&nbsp;made&nbsp;greedy&nbsp;by&nbsp;following<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;them&nbsp;&nbsp;with&nbsp;&nbsp;a&nbsp;&nbsp;question&nbsp;mark.&nbsp;In&nbsp;other&nbsp;words,&nbsp;it&nbsp;inverts&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;behaviour.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;When&nbsp;a&nbsp;parenthesized&nbsp;subpattern&nbsp;is&nbsp;quantified&nbsp;with&nbsp;a&nbsp;minimum<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repeat&nbsp;&nbsp;count&nbsp;&nbsp;that&nbsp;is&nbsp;greater&nbsp;than&nbsp;1&nbsp;or&nbsp;with&nbsp;a&nbsp;limited&nbsp;maximum,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;more&nbsp;store&nbsp;is&nbsp;required&nbsp;for&nbsp;the&nbsp;&nbsp;compiled&nbsp;&nbsp;pattern,&nbsp;&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proportion&nbsp;to&nbsp;the&nbsp;size&nbsp;of&nbsp;the&nbsp;minimum&nbsp;or&nbsp;maximum.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;a&nbsp;pattern&nbsp;starts&nbsp;with&nbsp;.*&nbsp;or&nbsp;&nbsp;.{0,}&nbsp;&nbsp;and&nbsp;&nbsp;the&nbsp;&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_DOTALL</A
>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;option&nbsp;(equivalent&nbsp;to&nbsp;Perl's&nbsp;/s)&nbsp;is&nbsp;set,&nbsp;thus&nbsp;allowing&nbsp;the&nbsp;.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;match&nbsp;newlines,&nbsp;then&nbsp;the&nbsp;pattern&nbsp;is&nbsp;implicitly&nbsp;&nbsp;anchored,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;because&nbsp;whatever&nbsp;follows&nbsp;will&nbsp;be&nbsp;tried&nbsp;against&nbsp;every&nbsp;character<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;position&nbsp;in&nbsp;the&nbsp;subject&nbsp;string,&nbsp;so&nbsp;there&nbsp;is&nbsp;no&nbsp;point&nbsp;&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retrying&nbsp;&nbsp;the&nbsp;overall&nbsp;match&nbsp;at&nbsp;any&nbsp;position&nbsp;after&nbsp;the&nbsp;first.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PCRE&nbsp;treats&nbsp;such&nbsp;a&nbsp;pattern&nbsp;as&nbsp;though&nbsp;it&nbsp;were&nbsp;preceded&nbsp;by&nbsp;\A.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;In&nbsp;&nbsp;cases&nbsp;where&nbsp;it&nbsp;is&nbsp;known&nbsp;that&nbsp;the&nbsp;subject&nbsp;string&nbsp;contains<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no&nbsp;newlines,&nbsp;it&nbsp;is&nbsp;worth&nbsp;setting&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_DOTALL</A
>&nbsp;&nbsp;when&nbsp;&nbsp;the&nbsp;&nbsp;pattern&nbsp;begins&nbsp;with&nbsp;.*&nbsp;in&nbsp;order&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obtain&nbsp;this&nbsp;optimization,&nbsp;or<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alternatively&nbsp;using&nbsp;^&nbsp;to&nbsp;indicate&nbsp;anchoring&nbsp;explicitly.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;When&nbsp;a&nbsp;capturing&nbsp;subpattern&nbsp;is&nbsp;repeated,&nbsp;the&nbsp;value&nbsp;&nbsp;captured<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;the&nbsp;substring&nbsp;that&nbsp;matched&nbsp;the&nbsp;final&nbsp;iteration.&nbsp;For&nbsp;example,&nbsp;after<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(tweedle[dume]{3}\s*)+<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;has&nbsp;matched&nbsp;"tweedledum&nbsp;tweedledee"&nbsp;the&nbsp;value&nbsp;&nbsp;of&nbsp;&nbsp;the&nbsp;&nbsp;captured<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;substring&nbsp;&nbsp;is&nbsp;&nbsp;"tweedledee".&nbsp;&nbsp;However,&nbsp;&nbsp;if&nbsp;&nbsp;there&nbsp;are<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nested&nbsp;capturing&nbsp;&nbsp;subpatterns,&nbsp;&nbsp;the&nbsp;&nbsp;corresponding&nbsp;&nbsp;captured<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;values&nbsp;&nbsp;may&nbsp;&nbsp;have&nbsp;been&nbsp;set&nbsp;in&nbsp;previous&nbsp;iterations.&nbsp;For&nbsp;example,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;after<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/(a|(b))+/<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;"aba"&nbsp;the&nbsp;value&nbsp;of&nbsp;the&nbsp;second&nbsp;captured&nbsp;substring&nbsp;&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"b".<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.back-references"
></A
><H3
>BACK REFERENCES</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Outside&nbsp;a&nbsp;character&nbsp;class,&nbsp;a&nbsp;backslash&nbsp;followed&nbsp;by&nbsp;&nbsp;a&nbsp;&nbsp;digit<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;greater&nbsp;&nbsp;than&nbsp;&nbsp;0&nbsp;&nbsp;(and&nbsp;&nbsp;possibly&nbsp;&nbsp;further&nbsp;&nbsp;digits)&nbsp;is&nbsp;a&nbsp;back<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference&nbsp;to&nbsp;a&nbsp;capturing&nbsp;subpattern&nbsp;&nbsp;earlier&nbsp;&nbsp;(i.e.&nbsp;&nbsp;to&nbsp;&nbsp;its<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left)&nbsp;&nbsp;in&nbsp;&nbsp;the&nbsp;&nbsp;pattern,&nbsp;&nbsp;provided&nbsp;there&nbsp;have&nbsp;been&nbsp;that&nbsp;many<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;previous&nbsp;capturing&nbsp;left&nbsp;parentheses.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;However,&nbsp;if&nbsp;the&nbsp;decimal&nbsp;number&nbsp;following&nbsp;&nbsp;the&nbsp;&nbsp;backslash&nbsp;&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;less&nbsp;&nbsp;than&nbsp;&nbsp;10,&nbsp;&nbsp;it&nbsp;is&nbsp;always&nbsp;taken&nbsp;as&nbsp;a&nbsp;back&nbsp;reference,&nbsp;and<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;causes&nbsp;an&nbsp;error&nbsp;only&nbsp;if&nbsp;there&nbsp;are&nbsp;not&nbsp;&nbsp;that&nbsp;&nbsp;many&nbsp;&nbsp;capturing<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;&nbsp;parentheses&nbsp;in&nbsp;the&nbsp;entire&nbsp;pattern.&nbsp;In&nbsp;other&nbsp;words,&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentheses&nbsp;that&nbsp;are&nbsp;referenced&nbsp;need&nbsp;not&nbsp;be&nbsp;to&nbsp;the&nbsp;&nbsp;left&nbsp;&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;reference&nbsp;&nbsp;for&nbsp;&nbsp;numbers&nbsp;&nbsp;less&nbsp;&nbsp;than&nbsp;10.&nbsp;See&nbsp;the&nbsp;section<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entitled&nbsp;"Backslash"&nbsp;above&nbsp;for&nbsp;further&nbsp;details&nbsp;of&nbsp;&nbsp;the&nbsp;&nbsp;handling<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;digits&nbsp;following&nbsp;a&nbsp;backslash.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;back&nbsp;reference&nbsp;matches&nbsp;whatever&nbsp;actually&nbsp;matched&nbsp;the&nbsp;&nbsp;capturing<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subpattern&nbsp;in&nbsp;the&nbsp;current&nbsp;subject&nbsp;string,&nbsp;rather&nbsp;than<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;anything&nbsp;matching&nbsp;the&nbsp;subpattern&nbsp;itself.&nbsp;So&nbsp;the&nbsp;pattern<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(sens|respons)e&nbsp;and&nbsp;\1ibility<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;"sense&nbsp;and&nbsp;sensibility"&nbsp;and&nbsp;"response&nbsp;and&nbsp;&nbsp;responsibility",<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;but&nbsp;&nbsp;not&nbsp;&nbsp;"sense&nbsp;&nbsp;and&nbsp;&nbsp;responsibility".&nbsp;If&nbsp;caseful<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matching&nbsp;is&nbsp;in&nbsp;force&nbsp;at&nbsp;the&nbsp;time&nbsp;of&nbsp;the&nbsp;back&nbsp;reference,&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;case&nbsp;of&nbsp;letters&nbsp;is&nbsp;relevant.&nbsp;For&nbsp;example,<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((?i)rah)\s+\1<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;"rah&nbsp;rah"&nbsp;and&nbsp;"RAH&nbsp;RAH",&nbsp;but&nbsp;&nbsp;not&nbsp;&nbsp;"RAH&nbsp;&nbsp;rah",&nbsp;&nbsp;even<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;though&nbsp;&nbsp;the&nbsp;&nbsp;original&nbsp;&nbsp;capturing&nbsp;subpattern&nbsp;is&nbsp;matched&nbsp;caselessly.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;There&nbsp;may&nbsp;be&nbsp;more&nbsp;than&nbsp;one&nbsp;back&nbsp;reference&nbsp;to&nbsp;the&nbsp;&nbsp;same&nbsp;&nbsp;subpattern.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;&nbsp;a&nbsp;&nbsp;subpattern&nbsp;&nbsp;has&nbsp;not&nbsp;actually&nbsp;been&nbsp;used&nbsp;in&nbsp;a<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;particular&nbsp;match,&nbsp;then&nbsp;any&nbsp;&nbsp;back&nbsp;&nbsp;references&nbsp;&nbsp;to&nbsp;&nbsp;it&nbsp;&nbsp;always<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fail.&nbsp;For&nbsp;example,&nbsp;the&nbsp;pattern<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a|(bc))\2<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;always&nbsp;fails&nbsp;if&nbsp;it&nbsp;starts&nbsp;to&nbsp;match&nbsp;&nbsp;"a"&nbsp;&nbsp;rather&nbsp;&nbsp;than&nbsp;&nbsp;"bc".<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Because&nbsp;&nbsp;there&nbsp;&nbsp;may&nbsp;&nbsp;be&nbsp;up&nbsp;to&nbsp;99&nbsp;back&nbsp;references,&nbsp;all&nbsp;digits<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;following&nbsp;the&nbsp;backslash&nbsp;are&nbsp;taken&nbsp;as&nbsp;&nbsp;part&nbsp;&nbsp;of&nbsp;&nbsp;a&nbsp;&nbsp;potential<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;back&nbsp;reference&nbsp;number.&nbsp;If&nbsp;the&nbsp;pattern&nbsp;continues&nbsp;with&nbsp;a&nbsp;digit<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;character,&nbsp;then&nbsp;some&nbsp;delimiter&nbsp;must&nbsp;be&nbsp;used&nbsp;to&nbsp;terminate&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;back&nbsp;reference.&nbsp;If&nbsp;the&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_EXTENDED</A
>&nbsp;&nbsp;option&nbsp;is&nbsp;set,&nbsp;this&nbsp;can<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be&nbsp;whitespace.&nbsp;&nbsp;Otherwise&nbsp;an&nbsp;empty&nbsp;comment&nbsp;can&nbsp;be&nbsp;used.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;back&nbsp;reference&nbsp;that&nbsp;occurs&nbsp;inside&nbsp;the&nbsp;parentheses&nbsp;to&nbsp;which<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;&nbsp;refers&nbsp;&nbsp;fails&nbsp;when&nbsp;the&nbsp;subpattern&nbsp;is&nbsp;first&nbsp;used,&nbsp;so,&nbsp;for<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;example,&nbsp;(a\1)&nbsp;never&nbsp;matches.&nbsp;&nbsp;However,&nbsp;such&nbsp;references&nbsp;&nbsp;can<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be&nbsp;useful&nbsp;inside&nbsp;repeated&nbsp;subpatterns.&nbsp;For&nbsp;example,&nbsp;the&nbsp;pattern<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a|b\1)+<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;any&nbsp;number&nbsp;of&nbsp;"a"s&nbsp;and&nbsp;also&nbsp;"aba",&nbsp;"ababaa"&nbsp;etc.&nbsp;&nbsp;At<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;each&nbsp;iteration&nbsp;of&nbsp;the&nbsp;subpattern,&nbsp;the&nbsp;back&nbsp;reference&nbsp;matches<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;character&nbsp;string&nbsp;corresponding&nbsp;to&nbsp;&nbsp;the&nbsp;&nbsp;previous&nbsp;&nbsp;iteration.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;In&nbsp;order&nbsp;for&nbsp;this&nbsp;to&nbsp;work,&nbsp;the&nbsp;pattern&nbsp;must&nbsp;be&nbsp;such<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;the&nbsp;first&nbsp;iteration&nbsp;does&nbsp;not&nbsp;need&nbsp;&nbsp;to&nbsp;&nbsp;match&nbsp;&nbsp;the&nbsp;&nbsp;back<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference.&nbsp;&nbsp;This&nbsp;&nbsp;can&nbsp;&nbsp;be&nbsp;&nbsp;done&nbsp;using&nbsp;alternation,&nbsp;as&nbsp;in&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;example&nbsp;above,&nbsp;or&nbsp;by&nbsp;a&nbsp;quantifier&nbsp;with&nbsp;a&nbsp;minimum&nbsp;of&nbsp;zero.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.assertions"
></A
><H3
>Assertions</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;An&nbsp;assertion&nbsp;is&nbsp;&nbsp;a&nbsp;&nbsp;test&nbsp;&nbsp;on&nbsp;&nbsp;the&nbsp;&nbsp;characters&nbsp;&nbsp;following&nbsp;&nbsp;or<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preceding&nbsp;&nbsp;the&nbsp;current&nbsp;matching&nbsp;point&nbsp;that&nbsp;does&nbsp;not&nbsp;actually<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;consume&nbsp;any&nbsp;characters.&nbsp;The&nbsp;simple&nbsp;assertions&nbsp;coded&nbsp;&nbsp;as&nbsp;&nbsp;\b,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\B,&nbsp;&nbsp;\A,&nbsp;&nbsp;\Z,&nbsp;&nbsp;\z,&nbsp;^&nbsp;and&nbsp;$&nbsp;are&nbsp;described&nbsp;above.&nbsp;More&nbsp;complicated<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertions&nbsp;are&nbsp;coded&nbsp;as&nbsp;&nbsp;subpatterns.&nbsp;&nbsp;There&nbsp;&nbsp;are&nbsp;&nbsp;two<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kinds:&nbsp;&nbsp;those&nbsp;that&nbsp;look&nbsp;ahead&nbsp;of&nbsp;the&nbsp;current&nbsp;position&nbsp;in&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subject&nbsp;string,&nbsp;and&nbsp;those&nbsp;that&nbsp;look&nbsp;behind&nbsp;it.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;An&nbsp;assertion&nbsp;subpattern&nbsp;is&nbsp;matched&nbsp;in&nbsp;the&nbsp;normal&nbsp;way,&nbsp;except<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;&nbsp;it&nbsp;&nbsp;does&nbsp;not&nbsp;cause&nbsp;the&nbsp;current&nbsp;matching&nbsp;position&nbsp;to&nbsp;be<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changed.&nbsp;Lookahead&nbsp;assertions&nbsp;start&nbsp;with&nbsp;&nbsp;(?=&nbsp;&nbsp;for&nbsp;&nbsp;positive<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertions&nbsp;and&nbsp;(?!&nbsp;for&nbsp;negative&nbsp;assertions.&nbsp;For&nbsp;example,<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\w+(?=;)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;a&nbsp;word&nbsp;followed&nbsp;by&nbsp;a&nbsp;semicolon,&nbsp;but&nbsp;does&nbsp;not&nbsp;include<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;semicolon&nbsp;in&nbsp;the&nbsp;match,&nbsp;and<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foo(?!bar)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;any&nbsp;occurrence&nbsp;of&nbsp;"foo"&nbsp;&nbsp;that&nbsp;&nbsp;is&nbsp;&nbsp;not&nbsp;&nbsp;followed&nbsp;&nbsp;by<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"bar".&nbsp;Note&nbsp;that&nbsp;the&nbsp;apparently&nbsp;similar&nbsp;pattern<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?!foo)bar<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;does&nbsp;not&nbsp;find&nbsp;an&nbsp;occurrence&nbsp;of&nbsp;"bar"&nbsp;&nbsp;that&nbsp;&nbsp;is&nbsp;&nbsp;preceded&nbsp;&nbsp;by<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;something&nbsp;other&nbsp;than&nbsp;"foo";&nbsp;it&nbsp;finds&nbsp;any&nbsp;occurrence&nbsp;of&nbsp;"bar"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whatsoever,&nbsp;because&nbsp;the&nbsp;assertion&nbsp;&nbsp;(?!foo)&nbsp;&nbsp;is&nbsp;&nbsp;always&nbsp;&nbsp;<TT
CLASS="constant"
><B
>TRUE</B
></TT
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;&nbsp;the&nbsp;&nbsp;next&nbsp;&nbsp;three&nbsp;&nbsp;characters&nbsp;&nbsp;are&nbsp;&nbsp;"bar".&nbsp;A&nbsp;lookbehind<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertion&nbsp;is&nbsp;needed&nbsp;to&nbsp;achieve&nbsp;this&nbsp;effect.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lookbehind&nbsp;assertions&nbsp;start&nbsp;with&nbsp;(?&#60;=&nbsp;&nbsp;for&nbsp;&nbsp;positive&nbsp;&nbsp;assertions<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;(?&#60;!&nbsp;for&nbsp;negative&nbsp;assertions.&nbsp;For&nbsp;example,<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?&#60;!foo)bar<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;does&nbsp;find&nbsp;an&nbsp;occurrence&nbsp;of&nbsp;"bar"&nbsp;that&nbsp;&nbsp;is&nbsp;&nbsp;not&nbsp;&nbsp;preceded&nbsp;&nbsp;by<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"foo".&nbsp;The&nbsp;contents&nbsp;of&nbsp;a&nbsp;lookbehind&nbsp;assertion&nbsp;are&nbsp;restricted<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;such&nbsp;that&nbsp;all&nbsp;the&nbsp;strings&nbsp;&nbsp;it&nbsp;&nbsp;matches&nbsp;&nbsp;must&nbsp;&nbsp;have&nbsp;&nbsp;a&nbsp;&nbsp;fixed<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length.&nbsp;&nbsp;However,&nbsp;if&nbsp;there&nbsp;are&nbsp;several&nbsp;alternatives,&nbsp;they&nbsp;do<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;all&nbsp;have&nbsp;to&nbsp;have&nbsp;the&nbsp;same&nbsp;fixed&nbsp;length.&nbsp;Thus<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?&#60;=bullock|donkey)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;permitted,&nbsp;but<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?&#60;!dogs?|cats?)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;causes&nbsp;an&nbsp;error&nbsp;at&nbsp;compile&nbsp;time.&nbsp;Branches&nbsp;&nbsp;that&nbsp;&nbsp;match&nbsp;&nbsp;different<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length&nbsp;strings&nbsp;are&nbsp;permitted&nbsp;only&nbsp;at&nbsp;the&nbsp;top&nbsp;level&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;lookbehind&nbsp;assertion.&nbsp;This&nbsp;is&nbsp;an&nbsp;extension&nbsp;&nbsp;compared&nbsp;&nbsp;with<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Perl&nbsp;&nbsp;5.005,&nbsp;&nbsp;which&nbsp;&nbsp;requires&nbsp;all&nbsp;branches&nbsp;to&nbsp;match&nbsp;the&nbsp;same<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length&nbsp;of&nbsp;string.&nbsp;An&nbsp;assertion&nbsp;such&nbsp;as<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?&#60;=ab(c|de))<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;not&nbsp;permitted,&nbsp;because&nbsp;its&nbsp;single&nbsp;&nbsp;top-level&nbsp;&nbsp;branch&nbsp;&nbsp;can<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match&nbsp;two&nbsp;different&nbsp;lengths,&nbsp;but&nbsp;it&nbsp;is&nbsp;acceptable&nbsp;if&nbsp;rewritten<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;use&nbsp;two&nbsp;top-level&nbsp;branches:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?&#60;=abc|abde)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;implementation&nbsp;of&nbsp;lookbehind&nbsp;&nbsp;assertions&nbsp;&nbsp;is,&nbsp;&nbsp;for&nbsp;&nbsp;each<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alternative,&nbsp;&nbsp;to&nbsp;&nbsp;temporarily&nbsp;move&nbsp;the&nbsp;current&nbsp;position&nbsp;back<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;by&nbsp;the&nbsp;fixed&nbsp;width&nbsp;and&nbsp;then&nbsp;&nbsp;try&nbsp;&nbsp;to&nbsp;&nbsp;match.&nbsp;&nbsp;If&nbsp;&nbsp;there&nbsp;&nbsp;are<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insufficient&nbsp;&nbsp;characters&nbsp;&nbsp;before&nbsp;&nbsp;the&nbsp;&nbsp;current&nbsp;position,&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match&nbsp;is&nbsp;deemed&nbsp;to&nbsp;fail.&nbsp;&nbsp;Lookbehinds&nbsp;&nbsp;in&nbsp;&nbsp;conjunction&nbsp;&nbsp;with<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;once-only&nbsp;&nbsp;subpatterns&nbsp;can&nbsp;be&nbsp;particularly&nbsp;useful&nbsp;for&nbsp;matching<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;the&nbsp;ends&nbsp;of&nbsp;strings;&nbsp;an&nbsp;example&nbsp;is&nbsp;given&nbsp;at&nbsp;&nbsp;the&nbsp;&nbsp;end<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;the&nbsp;section&nbsp;on&nbsp;once-only&nbsp;subpatterns.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Several&nbsp;assertions&nbsp;(of&nbsp;any&nbsp;sort)&nbsp;may&nbsp;&nbsp;occur&nbsp;&nbsp;in&nbsp;&nbsp;succession.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;example,<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?&#60;=\d{3})(?&#60;!999)foo<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;"foo"&nbsp;preceded&nbsp;by&nbsp;three&nbsp;digits&nbsp;that&nbsp;are&nbsp;&nbsp;not&nbsp;&nbsp;"999".<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Notice&nbsp;&nbsp;that&nbsp;each&nbsp;of&nbsp;the&nbsp;assertions&nbsp;is&nbsp;applied&nbsp;independently<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;the&nbsp;same&nbsp;point&nbsp;in&nbsp;the&nbsp;subject&nbsp;string.&nbsp;First&nbsp;&nbsp;there&nbsp;&nbsp;is&nbsp;&nbsp;a<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check&nbsp;&nbsp;that&nbsp;&nbsp;the&nbsp;&nbsp;previous&nbsp;&nbsp;three&nbsp;characters&nbsp;are&nbsp;all&nbsp;digits,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;there&nbsp;is&nbsp;a&nbsp;check&nbsp;that&nbsp;the&nbsp;same&nbsp;three&nbsp;characters&nbsp;are&nbsp;not<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"999".&nbsp;&nbsp;&nbsp;This&nbsp;&nbsp;pattern&nbsp;&nbsp;does&nbsp;not&nbsp;match&nbsp;"foo"&nbsp;preceded&nbsp;by&nbsp;six<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;characters,&nbsp;the&nbsp;first&nbsp;of&nbsp;which&nbsp;are&nbsp;digits&nbsp;and&nbsp;the&nbsp;last&nbsp;three<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;which&nbsp;&nbsp;are&nbsp;&nbsp;not&nbsp;&nbsp;"999".&nbsp;&nbsp;For&nbsp;&nbsp;example,&nbsp;&nbsp;it&nbsp;doesn't&nbsp;match<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"123abcfoo".&nbsp;A&nbsp;pattern&nbsp;to&nbsp;do&nbsp;that&nbsp;is<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?&#60;=\d{3}...)(?&#60;!999)foo<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;time&nbsp;the&nbsp;first&nbsp;assertion&nbsp;looks&nbsp;&nbsp;at&nbsp;&nbsp;the&nbsp;&nbsp;preceding&nbsp;&nbsp;six<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;characters,&nbsp;&nbsp;checking&nbsp;&nbsp;that&nbsp;&nbsp;the&nbsp;first&nbsp;three&nbsp;are&nbsp;digits,&nbsp;and<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;the&nbsp;second&nbsp;assertion&nbsp;checks&nbsp;that&nbsp;&nbsp;the&nbsp;&nbsp;preceding&nbsp;&nbsp;three<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;characters&nbsp;are&nbsp;not&nbsp;"999".<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assertions&nbsp;can&nbsp;be&nbsp;nested&nbsp;in&nbsp;any&nbsp;combination.&nbsp;For&nbsp;example,<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?&#60;=(?&#60;!foo)bar)baz<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;an&nbsp;occurrence&nbsp;of&nbsp;"baz"&nbsp;that&nbsp;&nbsp;is&nbsp;&nbsp;preceded&nbsp;&nbsp;by&nbsp;&nbsp;"bar"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;which&nbsp;in&nbsp;turn&nbsp;is&nbsp;not&nbsp;preceded&nbsp;by&nbsp;"foo",&nbsp;while<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?&#60;=\d{3}(?!999)...)foo<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;another&nbsp;pattern&nbsp;which&nbsp;matches&nbsp;&nbsp;"foo"&nbsp;&nbsp;preceded&nbsp;&nbsp;by&nbsp;&nbsp;three<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digits&nbsp;and&nbsp;any&nbsp;three&nbsp;characters&nbsp;that&nbsp;are&nbsp;not&nbsp;"999".<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assertion&nbsp;subpatterns&nbsp;are&nbsp;not&nbsp;capturing&nbsp;subpatterns,&nbsp;and&nbsp;may<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;&nbsp;be&nbsp;&nbsp;repeated,&nbsp;&nbsp;because&nbsp;&nbsp;it&nbsp;makes&nbsp;no&nbsp;sense&nbsp;to&nbsp;assert&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;same&nbsp;thing&nbsp;several&nbsp;times.&nbsp;If&nbsp;any&nbsp;kind&nbsp;of&nbsp;assertion&nbsp;&nbsp;contains<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;capturing&nbsp;&nbsp;subpatterns&nbsp;&nbsp;within&nbsp;it,&nbsp;these&nbsp;are&nbsp;counted&nbsp;for&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;purposes&nbsp;of&nbsp;numbering&nbsp;the&nbsp;capturing&nbsp;subpatterns&nbsp;in&nbsp;the&nbsp;whole<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern.&nbsp;&nbsp;&nbsp;However,&nbsp;&nbsp;substring&nbsp;capturing&nbsp;is&nbsp;carried&nbsp;out&nbsp;only<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;positive&nbsp;assertions,&nbsp;because&nbsp;it&nbsp;does&nbsp;not&nbsp;make&nbsp;sense&nbsp;&nbsp;for<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;negative&nbsp;assertions.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assertions&nbsp;count&nbsp;towards&nbsp;the&nbsp;maximum&nbsp;&nbsp;of&nbsp;&nbsp;200&nbsp;&nbsp;parenthesized<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subpatterns.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.onlyonce"
></A
><H3
>Once-only subpatterns</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;With&nbsp;both&nbsp;maximizing&nbsp;and&nbsp;minimizing&nbsp;repetition,&nbsp;&nbsp;failure&nbsp;&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;what&nbsp;&nbsp;follows&nbsp;&nbsp;normally&nbsp;&nbsp;causes&nbsp;&nbsp;the&nbsp;repeated&nbsp;item&nbsp;to&nbsp;be&nbsp;re-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evaluated&nbsp;to&nbsp;see&nbsp;if&nbsp;a&nbsp;different&nbsp;number&nbsp;of&nbsp;repeats&nbsp;allows&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rest&nbsp;&nbsp;of&nbsp;&nbsp;the&nbsp;&nbsp;pattern&nbsp;&nbsp;to&nbsp;&nbsp;match.&nbsp;Sometimes&nbsp;it&nbsp;is&nbsp;useful&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prevent&nbsp;this,&nbsp;either&nbsp;to&nbsp;change&nbsp;the&nbsp;nature&nbsp;of&nbsp;the&nbsp;&nbsp;match,&nbsp;&nbsp;or<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;cause&nbsp;&nbsp;it&nbsp;fail&nbsp;earlier&nbsp;than&nbsp;it&nbsp;otherwise&nbsp;might,&nbsp;when&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;author&nbsp;of&nbsp;the&nbsp;pattern&nbsp;knows&nbsp;there&nbsp;is&nbsp;no&nbsp;&nbsp;point&nbsp;&nbsp;in&nbsp;&nbsp;carrying<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Consider,&nbsp;for&nbsp;example,&nbsp;the&nbsp;pattern&nbsp;\d+foo&nbsp;&nbsp;when&nbsp;&nbsp;applied&nbsp;&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;subject&nbsp;line<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;123456bar<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;After&nbsp;matching&nbsp;all&nbsp;6&nbsp;digits&nbsp;and&nbsp;then&nbsp;failing&nbsp;to&nbsp;match&nbsp;"foo",<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;normal&nbsp;action&nbsp;of&nbsp;the&nbsp;matcher&nbsp;is&nbsp;to&nbsp;try&nbsp;again&nbsp;with&nbsp;only&nbsp;5<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digits&nbsp;matching&nbsp;the&nbsp;\d+&nbsp;item,&nbsp;and&nbsp;then&nbsp;with&nbsp;4,&nbsp;&nbsp;and&nbsp;&nbsp;so&nbsp;&nbsp;on,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;before&nbsp;ultimately&nbsp;failing.&nbsp;Once-only&nbsp;subpatterns&nbsp;provide&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;means&nbsp;for&nbsp;specifying&nbsp;that&nbsp;once&nbsp;a&nbsp;portion&nbsp;of&nbsp;the&nbsp;pattern&nbsp;&nbsp;has<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matched,&nbsp;&nbsp;it&nbsp;&nbsp;is&nbsp;&nbsp;not&nbsp;to&nbsp;be&nbsp;re-evaluated&nbsp;in&nbsp;this&nbsp;way,&nbsp;so&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matcher&nbsp;would&nbsp;give&nbsp;up&nbsp;immediately&nbsp;on&nbsp;failing&nbsp;to&nbsp;match&nbsp;&nbsp;"foo"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;first&nbsp;&nbsp;time.&nbsp;&nbsp;The&nbsp;&nbsp;notation&nbsp;&nbsp;is&nbsp;another&nbsp;kind&nbsp;of&nbsp;special<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parenthesis,&nbsp;starting&nbsp;with&nbsp;(?&#62;&nbsp;as&nbsp;in&nbsp;this&nbsp;example:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?&#62;\d+)bar<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;kind&nbsp;of&nbsp;parenthesis&nbsp;"locks&nbsp;up"&nbsp;the&nbsp;&nbsp;part&nbsp;of&nbsp;the&nbsp;pattern<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;&nbsp;contains&nbsp;once&nbsp;it&nbsp;has&nbsp;matched,&nbsp;and&nbsp;a&nbsp;failure&nbsp;further&nbsp;into<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;pattern&nbsp;is&nbsp;prevented&nbsp;from&nbsp;backtracking&nbsp;&nbsp;into&nbsp;&nbsp;it.&nbsp;&nbsp;Back-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tracking&nbsp;&nbsp;past&nbsp;&nbsp;it&nbsp;to&nbsp;previous&nbsp;items,&nbsp;however,&nbsp;works&nbsp;as&nbsp;normal.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;An&nbsp;alternative&nbsp;description&nbsp;is&nbsp;that&nbsp;a&nbsp;subpattern&nbsp;of&nbsp;this&nbsp;type<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;&nbsp;the&nbsp;&nbsp;string&nbsp;&nbsp;of&nbsp;&nbsp;characters&nbsp;that&nbsp;an&nbsp;identical&nbsp;standalone<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern&nbsp;would&nbsp;match,&nbsp;if&nbsp;anchored&nbsp;at&nbsp;the&nbsp;current&nbsp;point<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;the&nbsp;subject&nbsp;string.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Once-only&nbsp;subpatterns&nbsp;are&nbsp;not&nbsp;capturing&nbsp;subpatterns.&nbsp;&nbsp;Simple<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cases&nbsp;&nbsp;such&nbsp;as&nbsp;the&nbsp;above&nbsp;example&nbsp;can&nbsp;be&nbsp;thought&nbsp;of&nbsp;as&nbsp;a&nbsp;maximizing<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repeat&nbsp;that&nbsp;must&nbsp;&nbsp;swallow&nbsp;&nbsp;everything&nbsp;&nbsp;it&nbsp;&nbsp;can.&nbsp;&nbsp;So,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;both&nbsp;\d+&nbsp;and&nbsp;\d+?&nbsp;are&nbsp;prepared&nbsp;to&nbsp;adjust&nbsp;the&nbsp;number&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digits&nbsp;they&nbsp;match&nbsp;in&nbsp;order&nbsp;to&nbsp;make&nbsp;the&nbsp;rest&nbsp;of&nbsp;&nbsp;the&nbsp;&nbsp;pattern<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match,&nbsp;(?&#62;\d+)&nbsp;can&nbsp;only&nbsp;match&nbsp;an&nbsp;entire&nbsp;sequence&nbsp;of&nbsp;digits.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;construction&nbsp;can&nbsp;of&nbsp;course&nbsp;contain&nbsp;arbitrarily&nbsp;&nbsp;complicated<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subpatterns,&nbsp;and&nbsp;it&nbsp;can&nbsp;be&nbsp;nested.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Once-only&nbsp;subpatterns&nbsp;can&nbsp;be&nbsp;used&nbsp;in&nbsp;conjunction&nbsp;with&nbsp;&nbsp;look-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;behind&nbsp;&nbsp;assertions&nbsp;&nbsp;to&nbsp;specify&nbsp;efficient&nbsp;matching&nbsp;at&nbsp;the&nbsp;end<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;the&nbsp;subject&nbsp;string.&nbsp;Consider&nbsp;a&nbsp;simple&nbsp;pattern&nbsp;such&nbsp;as<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abcd$<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;applied&nbsp;to&nbsp;a&nbsp;long&nbsp;string&nbsp;which&nbsp;does&nbsp;not&nbsp;match.&nbsp;&nbsp;Because<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matching&nbsp;&nbsp;proceeds&nbsp;&nbsp;from&nbsp;&nbsp;left&nbsp;&nbsp;to&nbsp;right,&nbsp;PCRE&nbsp;will&nbsp;look&nbsp;for<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;each&nbsp;"a"&nbsp;in&nbsp;the&nbsp;subject&nbsp;and&nbsp;then&nbsp;see&nbsp;if&nbsp;what&nbsp;follows&nbsp;matches<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;rest&nbsp;of&nbsp;the&nbsp;pattern.&nbsp;If&nbsp;the&nbsp;pattern&nbsp;is&nbsp;specified&nbsp;as<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^.*abcd$<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;the&nbsp;initial&nbsp;.*&nbsp;matches&nbsp;the&nbsp;entire&nbsp;string&nbsp;at&nbsp;first,&nbsp;&nbsp;but<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;&nbsp;this&nbsp;&nbsp;fails&nbsp;&nbsp;(because&nbsp;&nbsp;there&nbsp;&nbsp;is&nbsp;no&nbsp;following&nbsp;"a"),&nbsp;it<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backtracks&nbsp;to&nbsp;match&nbsp;all&nbsp;but&nbsp;the&nbsp;last&nbsp;character,&nbsp;then&nbsp;all&nbsp;but<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;last&nbsp;&nbsp;two&nbsp;&nbsp;characters,&nbsp;and&nbsp;so&nbsp;on.&nbsp;Once&nbsp;again&nbsp;the&nbsp;search<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;"a"&nbsp;covers&nbsp;the&nbsp;entire&nbsp;string,&nbsp;from&nbsp;right&nbsp;to&nbsp;left,&nbsp;so&nbsp;&nbsp;we<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;are&nbsp;no&nbsp;better&nbsp;off.&nbsp;However,&nbsp;if&nbsp;the&nbsp;pattern&nbsp;is&nbsp;written&nbsp;as<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^(?&#62;.*)(?&#60;=abcd)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;there&nbsp;can&nbsp;be&nbsp;no&nbsp;backtracking&nbsp;for&nbsp;the&nbsp;.*&nbsp;&nbsp;item;&nbsp;&nbsp;it&nbsp;&nbsp;can<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match&nbsp;&nbsp;only&nbsp;&nbsp;the&nbsp;&nbsp;entire&nbsp;&nbsp;string.&nbsp;&nbsp;The&nbsp;subsequent&nbsp;lookbehind<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertion&nbsp;does&nbsp;a&nbsp;single&nbsp;test&nbsp;on&nbsp;the&nbsp;last&nbsp;four&nbsp;characters.&nbsp;If<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;&nbsp;fails,&nbsp;&nbsp;the&nbsp;&nbsp;match&nbsp;&nbsp;fails&nbsp;immediately.&nbsp;For&nbsp;long&nbsp;strings,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this&nbsp;approach&nbsp;makes&nbsp;a&nbsp;significant&nbsp;difference&nbsp;to&nbsp;the&nbsp;processing&nbsp;time.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;When&nbsp;a&nbsp;pattern&nbsp;contains&nbsp;an&nbsp;unlimited&nbsp;repeat&nbsp;inside&nbsp;a&nbsp;subpattern<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;can&nbsp;itself&nbsp;be&nbsp;repeated&nbsp;an&nbsp;unlimited&nbsp;number&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;times,&nbsp;the&nbsp;use&nbsp;of&nbsp;a&nbsp;once-only&nbsp;subpattern&nbsp;is&nbsp;the&nbsp;only&nbsp;way&nbsp;&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avoid&nbsp;&nbsp;some&nbsp;&nbsp;failing&nbsp;matches&nbsp;taking&nbsp;a&nbsp;very&nbsp;long&nbsp;time&nbsp;indeed.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;pattern<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(\D+|&#60;\d+&#62;)*[!?]<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;an&nbsp;unlimited&nbsp;number&nbsp;of&nbsp;substrings&nbsp;that&nbsp;&nbsp;either&nbsp;&nbsp;consist<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;non-digits,&nbsp;&nbsp;or&nbsp;digits&nbsp;enclosed&nbsp;in&nbsp;&#60;&#62;,&nbsp;followed&nbsp;by<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;either&nbsp;!&nbsp;or&nbsp;?.&nbsp;When&nbsp;it&nbsp;matches,&nbsp;it&nbsp;runs&nbsp;quickly.&nbsp;However,&nbsp;if<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;is&nbsp;applied&nbsp;to<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;takes&nbsp;a&nbsp;long&nbsp;&nbsp;time&nbsp;&nbsp;before&nbsp;&nbsp;reporting&nbsp;&nbsp;failure.&nbsp;&nbsp;This&nbsp;&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;because&nbsp;the&nbsp;string&nbsp;can&nbsp;be&nbsp;divided&nbsp;between&nbsp;the&nbsp;two&nbsp;repeats&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;large&nbsp;number&nbsp;of&nbsp;ways,&nbsp;and&nbsp;all&nbsp;have&nbsp;to&nbsp;be&nbsp;tried.&nbsp;(The&nbsp;example<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used&nbsp;&nbsp;[!?]&nbsp;&nbsp;rather&nbsp;&nbsp;than&nbsp;a&nbsp;single&nbsp;character&nbsp;at&nbsp;the&nbsp;end,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;because&nbsp;both&nbsp;PCRE&nbsp;and&nbsp;Perl&nbsp;have&nbsp;an&nbsp;optimization&nbsp;that&nbsp;&nbsp;allows<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;&nbsp;fast&nbsp;&nbsp;failure&nbsp;&nbsp;when&nbsp;&nbsp;a&nbsp;&nbsp;single&nbsp;&nbsp;character&nbsp;is&nbsp;used.&nbsp;They<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remember&nbsp;the&nbsp;last&nbsp;single&nbsp;character&nbsp;that&nbsp;is&nbsp;&nbsp;required&nbsp;&nbsp;for&nbsp;&nbsp;a<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match,&nbsp;&nbsp;and&nbsp;&nbsp;fail&nbsp;early&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;present&nbsp;in&nbsp;the&nbsp;string.)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;the&nbsp;pattern&nbsp;is&nbsp;changed&nbsp;to<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((?&#62;\D+)|&#60;\d+&#62;)*[!?]<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sequences&nbsp;of&nbsp;non-digits&nbsp;cannot&nbsp;be&nbsp;broken,&nbsp;and&nbsp;&nbsp;failure&nbsp;&nbsp;happens&nbsp;quickly.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.conditional"
></A
><H3
>Conditional subpatterns</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;It&nbsp;is&nbsp;possible&nbsp;to&nbsp;cause&nbsp;the&nbsp;matching&nbsp;process&nbsp;to&nbsp;obey&nbsp;a&nbsp;&nbsp;subpattern&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conditionally&nbsp;&nbsp;or&nbsp;to&nbsp;choose&nbsp;between&nbsp;two&nbsp;alternative<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subpatterns,&nbsp;depending&nbsp;on&nbsp;the&nbsp;result&nbsp;&nbsp;of&nbsp;&nbsp;an&nbsp;&nbsp;assertion,&nbsp;&nbsp;or<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whether&nbsp;&nbsp;a&nbsp;previous&nbsp;capturing&nbsp;subpattern&nbsp;matched&nbsp;or&nbsp;not.&nbsp;The<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;two&nbsp;possible&nbsp;forms&nbsp;of&nbsp;conditional&nbsp;subpattern&nbsp;are<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?(condition)yes-pattern)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?(condition)yes-pattern|no-pattern)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;the&nbsp;condition&nbsp;is&nbsp;satisfied,&nbsp;the&nbsp;yes-pattern&nbsp;is&nbsp;used;&nbsp;otherwise<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;no-pattern&nbsp;&nbsp;(if&nbsp;&nbsp;present)&nbsp;is&nbsp;used.&nbsp;If&nbsp;there&nbsp;are<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;more&nbsp;than&nbsp;two&nbsp;alternatives&nbsp;in&nbsp;the&nbsp;subpattern,&nbsp;a&nbsp;compile-time<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error&nbsp;occurs.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;There&nbsp;are&nbsp;two&nbsp;kinds&nbsp;of&nbsp;condition.&nbsp;If&nbsp;the&nbsp;&nbsp;text&nbsp;&nbsp;between&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentheses&nbsp;&nbsp;consists&nbsp;&nbsp;of&nbsp;&nbsp;a&nbsp;&nbsp;sequence&nbsp;&nbsp;of&nbsp;&nbsp;digits,&nbsp;then&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;condition&nbsp;is&nbsp;satisfied&nbsp;if&nbsp;the&nbsp;capturing&nbsp;subpattern&nbsp;&nbsp;of&nbsp;&nbsp;that<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number&nbsp;&nbsp;has&nbsp;&nbsp;previously&nbsp;matched.&nbsp;Consider&nbsp;the&nbsp;following&nbsp;pattern,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;which&nbsp;contains&nbsp;non-significant&nbsp;white&nbsp;space&nbsp;to&nbsp;make&nbsp;&nbsp;it<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;more&nbsp;&nbsp;readable&nbsp;&nbsp;(assume&nbsp;&nbsp;the&nbsp;&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_EXTENDED</A
>&nbsp;&nbsp;&nbsp;option)&nbsp;&nbsp;and&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;divide&nbsp;it&nbsp;into&nbsp;three&nbsp;parts&nbsp;for&nbsp;ease&nbsp;of&nbsp;discussion:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;\(&nbsp;)?&nbsp;&nbsp;&nbsp;&nbsp;[^()]+&nbsp;&nbsp;&nbsp;&nbsp;(?(1)&nbsp;\)&nbsp;)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;first&nbsp;part&nbsp;matches&nbsp;an&nbsp;optional&nbsp;opening&nbsp;parenthesis,&nbsp;&nbsp;and<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;that&nbsp;character&nbsp;is&nbsp;present,&nbsp;sets&nbsp;it&nbsp;as&nbsp;the&nbsp;first&nbsp;captured<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;substring.&nbsp;The&nbsp;second&nbsp;part&nbsp;matches&nbsp;one&nbsp;&nbsp;or&nbsp;&nbsp;more&nbsp;&nbsp;characters<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;&nbsp;are&nbsp;&nbsp;not&nbsp;&nbsp;parentheses.&nbsp;The&nbsp;third&nbsp;part&nbsp;is&nbsp;a&nbsp;conditional<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subpattern&nbsp;that&nbsp;tests&nbsp;whether&nbsp;the&nbsp;first&nbsp;set&nbsp;&nbsp;of&nbsp;&nbsp;parentheses<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matched&nbsp;&nbsp;or&nbsp;&nbsp;not.&nbsp;&nbsp;If&nbsp;&nbsp;they&nbsp;did,&nbsp;that&nbsp;is,&nbsp;if&nbsp;subject&nbsp;started<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;an&nbsp;opening&nbsp;parenthesis,&nbsp;the&nbsp;condition&nbsp;is&nbsp;<TT
CLASS="constant"
><B
>TRUE</B
></TT
>,&nbsp;&nbsp;and&nbsp;&nbsp;so<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;yes-pattern&nbsp;&nbsp;is&nbsp;&nbsp;executed&nbsp;&nbsp;and&nbsp;a&nbsp;closing&nbsp;parenthesis&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required.&nbsp;Otherwise,&nbsp;since&nbsp;no-pattern&nbsp;is&nbsp;&nbsp;not&nbsp;&nbsp;present,&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subpattern&nbsp;&nbsp;matches&nbsp;&nbsp;nothing.&nbsp;&nbsp;In&nbsp;&nbsp;other&nbsp;words,&nbsp;this&nbsp;pattern<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;a&nbsp;sequence&nbsp;of&nbsp;non-parentheses,&nbsp;&nbsp;optionally&nbsp;&nbsp;enclosed<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;parentheses.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;the&nbsp;condition&nbsp;is&nbsp;not&nbsp;a&nbsp;sequence&nbsp;of&nbsp;digits,&nbsp;it&nbsp;must&nbsp;be&nbsp;&nbsp;an<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertion.&nbsp;&nbsp;This&nbsp;&nbsp;may&nbsp;be&nbsp;a&nbsp;positive&nbsp;or&nbsp;negative&nbsp;lookahead&nbsp;or<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lookbehind&nbsp;assertion.&nbsp;Consider&nbsp;this&nbsp;pattern,&nbsp;again&nbsp;&nbsp;containing<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;non-significant&nbsp;&nbsp;white&nbsp;space,&nbsp;and&nbsp;with&nbsp;the&nbsp;two&nbsp;alternatives&nbsp;on<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;second&nbsp;line:<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?(?=[^a-z]*[a-z])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\d{2}-[a-z]{3}-\d{2}&nbsp;&nbsp;|&nbsp;&nbsp;\d{2}-\d{2}-\d{2}&nbsp;)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;condition&nbsp;is&nbsp;a&nbsp;positive&nbsp;lookahead&nbsp;assertion&nbsp;that&nbsp;matches<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;an&nbsp;optional&nbsp;sequence&nbsp;of&nbsp;non-letters&nbsp;followed&nbsp;by&nbsp;a&nbsp;letter.&nbsp;In<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;other&nbsp;words,&nbsp;it&nbsp;tests&nbsp;for&nbsp;&nbsp;the&nbsp;&nbsp;presence&nbsp;&nbsp;of&nbsp;&nbsp;at&nbsp;&nbsp;least&nbsp;&nbsp;one<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;letter&nbsp;&nbsp;in&nbsp;the&nbsp;subject.&nbsp;If&nbsp;a&nbsp;letter&nbsp;is&nbsp;found,&nbsp;the&nbsp;subject&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matched&nbsp;against&nbsp;&nbsp;the&nbsp;&nbsp;first&nbsp;&nbsp;alternative;&nbsp;&nbsp;otherwise&nbsp;&nbsp;it&nbsp;&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matched&nbsp;&nbsp;against&nbsp;the&nbsp;second.&nbsp;This&nbsp;pattern&nbsp;matches&nbsp;strings&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;one&nbsp;of&nbsp;the&nbsp;two&nbsp;forms&nbsp;dd-aaa-dd&nbsp;or&nbsp;dd-dd-dd,&nbsp;&nbsp;where&nbsp;&nbsp;aaa&nbsp;&nbsp;are<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;letters&nbsp;and&nbsp;dd&nbsp;are&nbsp;digits.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.comments"
></A
><H3
>Comments</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;&nbsp;sequence&nbsp;&nbsp;(?#&nbsp;&nbsp;marks&nbsp;&nbsp;the&nbsp;&nbsp;start&nbsp;&nbsp;of&nbsp;&nbsp;a&nbsp;&nbsp;comment&nbsp;&nbsp;which<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continues&nbsp;&nbsp;&nbsp;up&nbsp;&nbsp;to&nbsp;&nbsp;the&nbsp;&nbsp;next&nbsp;&nbsp;closing&nbsp;&nbsp;parenthesis.&nbsp;&nbsp;Nested<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentheses&nbsp;are&nbsp;not&nbsp;permitted.&nbsp;The&nbsp;characters&nbsp;that&nbsp;make&nbsp;up&nbsp;a<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comment&nbsp;play&nbsp;no&nbsp;part&nbsp;in&nbsp;the&nbsp;pattern&nbsp;matching&nbsp;at&nbsp;all.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;the&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_EXTENDED</A
>&nbsp;&nbsp;option&nbsp;is&nbsp;set,&nbsp;an&nbsp;unescaped&nbsp;#&nbsp;character<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outside&nbsp;&nbsp;a&nbsp;character&nbsp;class&nbsp;introduces&nbsp;a&nbsp;comment&nbsp;that&nbsp;contin-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ues&nbsp;up&nbsp;to&nbsp;the&nbsp;next&nbsp;newline&nbsp;character&nbsp;in&nbsp;the&nbsp;pattern.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.recursive"
></A
><H3
>Recursive patterns</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Consider&nbsp;the&nbsp;problem&nbsp;of&nbsp;matching&nbsp;a&nbsp;&nbsp;string&nbsp;&nbsp;in&nbsp;&nbsp;parentheses,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allowing&nbsp;&nbsp;for&nbsp;&nbsp;unlimited&nbsp;nested&nbsp;parentheses.&nbsp;Without&nbsp;the&nbsp;use<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;recursion,&nbsp;the&nbsp;best&nbsp;that&nbsp;can&nbsp;be&nbsp;done&nbsp;is&nbsp;to&nbsp;use&nbsp;a&nbsp;&nbsp;pattern<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;&nbsp;matches&nbsp;&nbsp;up&nbsp;&nbsp;to&nbsp;some&nbsp;fixed&nbsp;depth&nbsp;of&nbsp;nesting.&nbsp;It&nbsp;is&nbsp;not<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;possible&nbsp;to&nbsp;handle&nbsp;an&nbsp;arbitrary&nbsp;nesting&nbsp;depth.&nbsp;Perl&nbsp;5.6&nbsp;&nbsp;has<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;provided&nbsp;&nbsp;&nbsp;an&nbsp;&nbsp;experimental&nbsp;&nbsp;facility&nbsp;&nbsp;that&nbsp;&nbsp;allows&nbsp;&nbsp;regular<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expressions&nbsp;to&nbsp;recurse&nbsp;(amongst&nbsp;other&nbsp;things).&nbsp;&nbsp;The&nbsp;&nbsp;special&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item&nbsp;(?R)&nbsp;is&nbsp;&nbsp;provided&nbsp;for&nbsp;&nbsp;the&nbsp;specific&nbsp;&nbsp;case&nbsp;of&nbsp;recursion.&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;PCRE&nbsp;&nbsp;pattern&nbsp;&nbsp;solves&nbsp;the&nbsp;&nbsp;parentheses&nbsp;&nbsp;problem&nbsp;(assume&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_EXTENDED</A
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;option&nbsp;is&nbsp;set&nbsp;so&nbsp;that&nbsp;white&nbsp;space&nbsp;is&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ignored):<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\(&nbsp;(&nbsp;(?&#62;[^()]+)&nbsp;|&nbsp;(?R)&nbsp;)*&nbsp;\)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;First&nbsp;it&nbsp;matches&nbsp;an&nbsp;opening&nbsp;parenthesis.&nbsp;Then&nbsp;it&nbsp;matches&nbsp;any<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number&nbsp;&nbsp;of&nbsp;substrings&nbsp;which&nbsp;can&nbsp;either&nbsp;be&nbsp;a&nbsp;sequence&nbsp;of&nbsp;non-<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentheses,&nbsp;or&nbsp;a&nbsp;recursive&nbsp;&nbsp;match&nbsp;&nbsp;of&nbsp;&nbsp;the&nbsp;&nbsp;pattern&nbsp;&nbsp;itself<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(i.e.&nbsp;a&nbsp;correctly&nbsp;parenthesized&nbsp;substring).&nbsp;Finally&nbsp;there&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;closing&nbsp;parenthesis.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;particular&nbsp;example&nbsp;pattern&nbsp;&nbsp;contains&nbsp;&nbsp;nested&nbsp;&nbsp;unlimited<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repeats,&nbsp;and&nbsp;so&nbsp;the&nbsp;use&nbsp;of&nbsp;a&nbsp;once-only&nbsp;subpattern&nbsp;for&nbsp;matching<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strings&nbsp;of&nbsp;non-parentheses&nbsp;is&nbsp;&nbsp;important&nbsp;&nbsp;when&nbsp;&nbsp;applying<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;pattern&nbsp;to&nbsp;strings&nbsp;that&nbsp;do&nbsp;not&nbsp;match.&nbsp;For&nbsp;example,&nbsp;when<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;is&nbsp;applied&nbsp;to<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;yields&nbsp;"no&nbsp;match"&nbsp;quickly.&nbsp;However,&nbsp;if&nbsp;a&nbsp;&nbsp;once-only&nbsp;&nbsp;subpattern<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;not&nbsp;&nbsp;used,&nbsp;&nbsp;the&nbsp;match&nbsp;runs&nbsp;for&nbsp;a&nbsp;very&nbsp;long&nbsp;time<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indeed&nbsp;because&nbsp;there&nbsp;are&nbsp;so&nbsp;many&nbsp;different&nbsp;ways&nbsp;the&nbsp;+&nbsp;and&nbsp;&nbsp;*<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repeats&nbsp;&nbsp;can&nbsp;carve&nbsp;up&nbsp;the&nbsp;subject,&nbsp;and&nbsp;all&nbsp;have&nbsp;to&nbsp;be&nbsp;tested<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;before&nbsp;failure&nbsp;can&nbsp;be&nbsp;reported.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;values&nbsp;set&nbsp;for&nbsp;any&nbsp;capturing&nbsp;subpatterns&nbsp;are&nbsp;those&nbsp;&nbsp;from<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;outermost&nbsp;level&nbsp;of&nbsp;the&nbsp;recursion&nbsp;at&nbsp;which&nbsp;the&nbsp;subpattern<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;is&nbsp;set.&nbsp;If&nbsp;the&nbsp;pattern&nbsp;above&nbsp;is&nbsp;matched&nbsp;against<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ab(cd)ef)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;value&nbsp;for&nbsp;the&nbsp;capturing&nbsp;parentheses&nbsp;is&nbsp;&nbsp;"ef",&nbsp;&nbsp;which&nbsp;&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;last&nbsp;&nbsp;value&nbsp;&nbsp;taken&nbsp;&nbsp;on&nbsp;&nbsp;at&nbsp;the&nbsp;top&nbsp;level.&nbsp;If&nbsp;additional<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentheses&nbsp;are&nbsp;added,&nbsp;giving<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\(&nbsp;(&nbsp;(&nbsp;(?&#62;[^()]+)&nbsp;|&nbsp;(?R)&nbsp;)*&nbsp;)&nbsp;\)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^&nbsp;then&nbsp;the&nbsp;string&nbsp;they&nbsp;capture<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;"ab(cd)ef",&nbsp;the&nbsp;contents&nbsp;of&nbsp;the&nbsp;top&nbsp;level&nbsp;parentheses.&nbsp;If<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;there&nbsp;are&nbsp;more&nbsp;than&nbsp;15&nbsp;capturing&nbsp;parentheses&nbsp;in&nbsp;&nbsp;a&nbsp;&nbsp;pattern,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PCRE&nbsp;&nbsp;has&nbsp;&nbsp;to&nbsp;&nbsp;obtain&nbsp;&nbsp;extra&nbsp;&nbsp;memory&nbsp;&nbsp;to&nbsp;store&nbsp;data&nbsp;during&nbsp;a<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recursion,&nbsp;which&nbsp;it&nbsp;does&nbsp;by&nbsp;using&nbsp;&nbsp;pcre_malloc,&nbsp;&nbsp;freeing&nbsp;&nbsp;it<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;via&nbsp;&nbsp;pcre_free&nbsp;&nbsp;afterwards.&nbsp;If&nbsp;no&nbsp;memory&nbsp;can&nbsp;be&nbsp;obtained,&nbsp;it<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saves&nbsp;data&nbsp;for&nbsp;the&nbsp;first&nbsp;15&nbsp;capturing&nbsp;parentheses&nbsp;&nbsp;only,&nbsp;&nbsp;as<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;there&nbsp;is&nbsp;no&nbsp;way&nbsp;to&nbsp;give&nbsp;an&nbsp;out-of-memory&nbsp;error&nbsp;from&nbsp;within&nbsp;a<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recursion.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
><DIV
CLASS="refsect2"
><A
NAME="regexp.reference.performances"
></A
><H3
>Performances</H3
><P
CLASS="literallayout"
><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Certain&nbsp;items&nbsp;that&nbsp;may&nbsp;appear&nbsp;in&nbsp;patterns&nbsp;are&nbsp;more&nbsp;efficient<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;than&nbsp;&nbsp;others.&nbsp;&nbsp;It&nbsp;is&nbsp;more&nbsp;efficient&nbsp;to&nbsp;use&nbsp;a&nbsp;character&nbsp;class<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;like&nbsp;[aeiou]&nbsp;than&nbsp;a&nbsp;set&nbsp;of&nbsp;alternatives&nbsp;such&nbsp;as&nbsp;(a|e|i|o|u).<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;In&nbsp;&nbsp;general,&nbsp;&nbsp;the&nbsp;&nbsp;simplest&nbsp;&nbsp;construction&nbsp;&nbsp;that&nbsp;provides&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required&nbsp;behaviour&nbsp;is&nbsp;usually&nbsp;the&nbsp;&nbsp;most&nbsp;&nbsp;efficient.&nbsp;&nbsp;Jeffrey<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Friedl's&nbsp;&nbsp;book&nbsp;contains&nbsp;a&nbsp;lot&nbsp;of&nbsp;discussion&nbsp;about&nbsp;optimizing<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regular&nbsp;expressions&nbsp;for&nbsp;efficient&nbsp;performance.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;When&nbsp;a&nbsp;pattern&nbsp;begins&nbsp;with&nbsp;.*&nbsp;and&nbsp;the&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_DOTALL</A
>&nbsp;&nbsp;option&nbsp;&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set,&nbsp;&nbsp;the&nbsp;&nbsp;pattern&nbsp;&nbsp;is&nbsp;implicitly&nbsp;anchored&nbsp;by&nbsp;PCRE,&nbsp;since&nbsp;it<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;can&nbsp;match&nbsp;only&nbsp;at&nbsp;the&nbsp;start&nbsp;of&nbsp;a&nbsp;subject&nbsp;string.&nbsp;However,&nbsp;if<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_DOTALL</A
>&nbsp;&nbsp;&nbsp;is&nbsp;not&nbsp;set,&nbsp;PCRE&nbsp;cannot&nbsp;make&nbsp;this&nbsp;optimization,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;because&nbsp;the&nbsp;.&nbsp;metacharacter&nbsp;does&nbsp;not&nbsp;then&nbsp;match&nbsp;&nbsp;a&nbsp;&nbsp;newline,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;if&nbsp;the&nbsp;subject&nbsp;string&nbsp;contains&nbsp;newlines,&nbsp;the&nbsp;pattern&nbsp;may<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match&nbsp;from&nbsp;the&nbsp;character&nbsp;immediately&nbsp;following&nbsp;one&nbsp;&nbsp;of&nbsp;&nbsp;them<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instead&nbsp;of&nbsp;from&nbsp;the&nbsp;very&nbsp;start.&nbsp;For&nbsp;example,&nbsp;the&nbsp;pattern<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(.*)&nbsp;second<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matches&nbsp;the&nbsp;subject&nbsp;"first\nand&nbsp;second"&nbsp;(where&nbsp;\n&nbsp;stands&nbsp;for<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;newline&nbsp;character)&nbsp;with&nbsp;the&nbsp;first&nbsp;captured&nbsp;substring&nbsp;being<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"and".&nbsp;In&nbsp;order&nbsp;to&nbsp;do&nbsp;this,&nbsp;PCRE&nbsp;&nbsp;has&nbsp;&nbsp;to&nbsp;&nbsp;retry&nbsp;&nbsp;the&nbsp;&nbsp;match<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;starting&nbsp;after&nbsp;every&nbsp;newline&nbsp;in&nbsp;the&nbsp;subject.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;you&nbsp;are&nbsp;using&nbsp;such&nbsp;a&nbsp;pattern&nbsp;with&nbsp;subject&nbsp;strings&nbsp;that&nbsp;do<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;&nbsp;contain&nbsp;&nbsp;newlines,&nbsp;&nbsp;the&nbsp;best&nbsp;performance&nbsp;is&nbsp;obtained&nbsp;by<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setting&nbsp;<A
HREF="pcre.pattern.modifiers.html"
>PCRE_DOTALL</A
>&nbsp;,&nbsp;or&nbsp;starting&nbsp;the&nbsp;&nbsp;pattern&nbsp;&nbsp;with&nbsp;&nbsp;^.*&nbsp;&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indicate&nbsp;&nbsp;explicit&nbsp;anchoring.&nbsp;That&nbsp;saves&nbsp;PCRE&nbsp;from&nbsp;having&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scan&nbsp;along&nbsp;the&nbsp;subject&nbsp;looking&nbsp;for&nbsp;a&nbsp;newline&nbsp;to&nbsp;restart&nbsp;at.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Beware&nbsp;of&nbsp;patterns&nbsp;that&nbsp;contain&nbsp;nested&nbsp;&nbsp;indefinite&nbsp;&nbsp;repeats.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;These&nbsp;&nbsp;can&nbsp;&nbsp;take&nbsp;a&nbsp;long&nbsp;time&nbsp;to&nbsp;run&nbsp;when&nbsp;applied&nbsp;to&nbsp;a&nbsp;string<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;does&nbsp;not&nbsp;match.&nbsp;Consider&nbsp;the&nbsp;pattern&nbsp;fragment<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a+)*<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;can&nbsp;match&nbsp;"aaaa"&nbsp;in&nbsp;33&nbsp;different&nbsp;ways,&nbsp;and&nbsp;this&nbsp;&nbsp;number<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;increases&nbsp;&nbsp;very&nbsp;&nbsp;rapidly&nbsp;&nbsp;as&nbsp;&nbsp;the&nbsp;string&nbsp;gets&nbsp;longer.&nbsp;(The&nbsp;*<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repeat&nbsp;can&nbsp;match&nbsp;0,&nbsp;1,&nbsp;2,&nbsp;3,&nbsp;or&nbsp;4&nbsp;times,&nbsp;&nbsp;and&nbsp;&nbsp;for&nbsp;&nbsp;each&nbsp;&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;those&nbsp;&nbsp;cases&nbsp;other&nbsp;than&nbsp;0,&nbsp;the&nbsp;+&nbsp;repeats&nbsp;can&nbsp;match&nbsp;different<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numbers&nbsp;of&nbsp;times.)&nbsp;When&nbsp;the&nbsp;remainder&nbsp;of&nbsp;the&nbsp;pattern&nbsp;is&nbsp;such<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;&nbsp;the&nbsp;entire&nbsp;match&nbsp;is&nbsp;going&nbsp;to&nbsp;fail,&nbsp;PCRE&nbsp;has&nbsp;in&nbsp;principle<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;try&nbsp;every&nbsp;possible&nbsp;variation,&nbsp;and&nbsp;this&nbsp;&nbsp;can&nbsp;&nbsp;take&nbsp;&nbsp;an<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extremely&nbsp;long&nbsp;time.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;An&nbsp;optimization&nbsp;catches&nbsp;some&nbsp;of&nbsp;the&nbsp;more&nbsp;simple&nbsp;&nbsp;cases&nbsp;&nbsp;such<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;as<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a+)*b<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;a&nbsp;literal&nbsp;character&nbsp;follows.&nbsp;Before&nbsp;embarking&nbsp;&nbsp;on&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;standard&nbsp;matching&nbsp;procedure,&nbsp;PCRE&nbsp;checks&nbsp;that&nbsp;there&nbsp;is&nbsp;a&nbsp;"b"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;later&nbsp;in&nbsp;the&nbsp;subject&nbsp;string,&nbsp;and&nbsp;if&nbsp;there&nbsp;is&nbsp;not,&nbsp;&nbsp;it&nbsp;&nbsp;fails<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;match&nbsp;&nbsp;immediately.&nbsp;However,&nbsp;when&nbsp;there&nbsp;is&nbsp;no&nbsp;following<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;literal&nbsp;this&nbsp;optimization&nbsp;cannot&nbsp;be&nbsp;used.&nbsp;You&nbsp;&nbsp;can&nbsp;&nbsp;see&nbsp;&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;difference&nbsp;by&nbsp;comparing&nbsp;the&nbsp;behaviour&nbsp;of<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(a+)*\d<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;the&nbsp;pattern&nbsp;above.&nbsp;The&nbsp;former&nbsp;gives&nbsp;&nbsp;a&nbsp;&nbsp;failure&nbsp;&nbsp;almost<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instantly&nbsp;&nbsp;when&nbsp;&nbsp;applied&nbsp;&nbsp;to&nbsp;a&nbsp;whole&nbsp;line&nbsp;of&nbsp;"a"&nbsp;characters,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whereas&nbsp;the&nbsp;latter&nbsp;takes&nbsp;an&nbsp;appreciable&nbsp;&nbsp;time&nbsp;&nbsp;with&nbsp;&nbsp;strings<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;longer&nbsp;than&nbsp;about&nbsp;20&nbsp;characters.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="pcre.pattern.modifiers.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="function.preg-grep.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Pattern Modifiers</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="ref.pcre.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>preg_grep</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>