| .\" $OpenBSD: re_format.7,v 1.14 2007/05/31 19:19:30 jmc Exp $ | |
| .\" | |
| .\" Copyright (c) 1997, Phillip F Knaack. All rights reserved. | |
| .\" | |
| .\" Copyright (c) 1992, 1993, 1994 Henry Spencer. | |
| .\" Copyright (c) 1992, 1993, 1994 | |
| .\" The Regents of the University of California. All rights reserved. | |
| .\" | |
| .\" This code is derived from software contributed to Berkeley by | |
| .\" Henry Spencer. | |
| .\" | |
| .\" Redistribution and use in source and binary forms, with or without | |
| .\" modification, are permitted provided that the following conditions | |
| .\" are met: | |
| .\" 1. Redistributions of source code must retain the above copyright | |
| .\" notice, this list of conditions and the following disclaimer. | |
| .\" 2. Redistributions in binary form must reproduce the above copyright | |
| .\" notice, this list of conditions and the following disclaimer in the | |
| .\" documentation and/or other materials provided with the distribution. | |
| .\" 3. Neither the name of the University nor the names of its contributors | |
| .\" may be used to endorse or promote products derived from this software | |
| .\" without specific prior written permission. | |
| .\" | |
| .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
| .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
| .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
| .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
| .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| .\" SUCH DAMAGE. | |
| .\" | |
| .\" @(#)re_format.7 8.3 (Berkeley) 3/20/94 | |
| .\" | |
| .Dd $Mdocdate: May 31 2007 $ | |
| .Dt RE_FORMAT 7 | |
| .Os | |
| .Sh NAME | |
| .Nm re_format | |
| .Nd POSIX regular expressions | |
| .Sh DESCRIPTION | |
| Regular expressions (REs), | |
| as defined in | |
| .St -p1003.1-2004 , | |
| come in two forms: | |
| basic regular expressions | |
| (BREs) | |
| and extended regular expressions | |
| (EREs). | |
| Both forms of regular expressions are supported | |
| by the interfaces described in | |
| .Xr regex 3 . | |
| Applications dealing with regular expressions | |
| may use one or the other form | |
| (or indeed both). | |
| For example, | |
| .Xr ed 1 | |
| uses BREs, | |
| whilst | |
| .Xr egrep 1 | |
| talks EREs. | |
| Consult the manual page for the specific application to find out which | |
| it uses. | |
| .Pp | |
| POSIX leaves some aspects of RE syntax and semantics open; | |
| .Sq ** | |
| marks decisions on these aspects that | |
| may not be fully portable to other POSIX implementations. | |
| .Pp | |
| This manual page first describes regular expressions in general, | |
| specifically extended regular expressions, | |
| and then discusses differences between them and basic regular expressions. | |
| .Sh EXTENDED REGULAR EXPRESSIONS | |
| An ERE is one** or more non-empty** | |
| .Em branches , | |
| separated by | |
| .Sq \*(Ba . | |
| It matches anything that matches one of the branches. | |
| .Pp | |
| A branch is one** or more | |
| .Em pieces , | |
| concatenated. | |
| It matches a match for the first, followed by a match for the second, etc. | |
| .Pp | |
| A piece is an | |
| .Em atom | |
| possibly followed by a single** | |
| .Sq * , | |
| .Sq + , | |
| .Sq ?\& , | |
| or | |
| .Em bound . | |
| An atom followed by | |
| .Sq * | |
| matches a sequence of 0 or more matches of the atom. | |
| An atom followed by | |
| .Sq + | |
| matches a sequence of 1 or more matches of the atom. | |
| An atom followed by | |
| .Sq ?\& | |
| matches a sequence of 0 or 1 matches of the atom. | |
| .Pp | |
| A bound is | |
| .Sq { | |
| followed by an unsigned decimal integer, | |
| possibly followed by | |
| .Sq ,\& | |
| possibly followed by another unsigned decimal integer, | |
| always followed by | |
| .Sq } . | |
| The integers must lie between 0 and | |
| .Dv RE_DUP_MAX | |
| (255**) inclusive, | |
| and if there are two of them, the first may not exceed the second. | |
| An atom followed by a bound containing one integer | |
| .Ar i | |
| and no comma matches | |
| a sequence of exactly | |
| .Ar i | |
| matches of the atom. | |
| An atom followed by a bound | |
| containing one integer | |
| .Ar i | |
| and a comma matches | |
| a sequence of | |
| .Ar i | |
| or more matches of the atom. | |
| An atom followed by a bound | |
| containing two integers | |
| .Ar i | |
| and | |
| .Ar j | |
| matches a sequence of | |
| .Ar i | |
| through | |
| .Ar j | |
| (inclusive) matches of the atom. | |
| .Pp | |
| An atom is a regular expression enclosed in | |
| .Sq () | |
| (matching a part of the regular expression), | |
| an empty set of | |
| .Sq () | |
| (matching the null string)**, | |
| a | |
| .Em bracket expression | |
| (see below), | |
| .Sq .\& | |
| (matching any single character), | |
| .Sq ^ | |
| (matching the null string at the beginning of a line), | |
| .Sq $ | |
| (matching the null string at the end of a line), | |
| a | |
| .Sq \e | |
| followed by one of the characters | |
| .Sq ^.[$()|*+?{\e | |
| (matching that character taken as an ordinary character), | |
| a | |
| .Sq \e | |
| followed by any other character** | |
| (matching that character taken as an ordinary character, | |
| as if the | |
| .Sq \e | |
| had not been present**), | |
| or a single character with no other significance (matching that character). | |
| A | |
| .Sq { | |
| followed by a character other than a digit is an ordinary character, | |
| not the beginning of a bound**. | |
| It is illegal to end an RE with | |
| .Sq \e . | |
| .Pp | |
| A bracket expression is a list of characters enclosed in | |
| .Sq [] . | |
| It normally matches any single character from the list (but see below). | |
| If the list begins with | |
| .Sq ^ , | |
| it matches any single character | |
| .Em not | |
| from the rest of the list | |
| (but see below). | |
| If two characters in the list are separated by | |
| .Sq - , | |
| this is shorthand for the full | |
| .Em range | |
| of characters between those two (inclusive) in the | |
| collating sequence, e.g.\& | |
| .Sq [0-9] | |
| in ASCII matches any decimal digit. | |
| It is illegal** for two ranges to share an endpoint, e.g.\& | |
| .Sq a-c-e . | |
| Ranges are very collating-sequence-dependent, | |
| and portable programs should avoid relying on them. | |
| .Pp | |
| To include a literal | |
| .Sq ]\& | |
| in the list, make it the first character | |
| (following a possible | |
| .Sq ^ ) . | |
| To include a literal | |
| .Sq - , | |
| make it the first or last character, | |
| or the second endpoint of a range. | |
| To use a literal | |
| .Sq - | |
| as the first endpoint of a range, | |
| enclose it in | |
| .Sq [. | |
| and | |
| .Sq .] | |
| to make it a collating element (see below). | |
| With the exception of these and some combinations using | |
| .Sq [ | |
| (see next paragraphs), | |
| all other special characters, including | |
| .Sq \e , | |
| lose their special significance within a bracket expression. | |
| .Pp | |
| Within a bracket expression, a collating element | |
| (a character, | |
| a multi-character sequence that collates as if it were a single character, | |
| or a collating-sequence name for either) | |
| enclosed in | |
| .Sq [. | |
| and | |
| .Sq .] | |
| stands for the sequence of characters of that collating element. | |
| The sequence is a single element of the bracket expression's list. | |
| A bracket expression containing a multi-character collating element | |
| can thus match more than one character, | |
| e.g. if the collating sequence includes a | |
| .Sq ch | |
| collating element, | |
| then the RE | |
| .Sq [[.ch.]]*c | |
| matches the first five characters of | |
| .Sq chchcc . | |
| .Pp | |
| Within a bracket expression, a collating element enclosed in | |
| .Sq [= | |
| and | |
| .Sq =] | |
| is an equivalence class, standing for the sequences of characters | |
| of all collating elements equivalent to that one, including itself. | |
| (If there are no other equivalent collating elements, | |
| the treatment is as if the enclosing delimiters were | |
| .Sq [. | |
| and | |
| .Sq .] . ) | |
| For example, if | |
| .Sq x | |
| and | |
| .Sq y | |
| are the members of an equivalence class, | |
| then | |
| .Sq [[=x=]] , | |
| .Sq [[=y=]] , | |
| and | |
| .Sq [xy] | |
| are all synonymous. | |
| An equivalence class may not** be an endpoint of a range. | |
| .Pp | |
| Within a bracket expression, the name of a | |
| .Em character class | |
| enclosed | |
| in | |
| .Sq [: | |
| and | |
| .Sq :] | |
| stands for the list of all characters belonging to that class. | |
| Standard character class names are: | |
| .Bd -literal -offset indent | |
| alnum digit punct | |
| alpha graph space | |
| blank lower upper | |
| cntrl print xdigit | |
| .Ed | |
| .Pp | |
| These stand for the character classes defined in | |
| .Xr ctype 3 . | |
| A locale may provide others. | |
| A character class may not be used as an endpoint of a range. | |
| .Pp | |
| There are two special cases** of bracket expressions: | |
| the bracket expressions | |
| .Sq [[:<:]] | |
| and | |
| .Sq [[:>:]] | |
| match the null string at the beginning and end of a word, respectively. | |
| A word is defined as a sequence of | |
| characters starting and ending with a word character | |
| which is neither preceded nor followed by | |
| word characters. | |
| A word character is an | |
| .Em alnum | |
| character (as defined by | |
| .Xr ctype 3 ) | |
| or an underscore. | |
| This is an extension, | |
| compatible with but not specified by POSIX, | |
| and should be used with | |
| caution in software intended to be portable to other systems. | |
| .Pp | |
| In the event that an RE could match more than one substring of a given | |
| string, | |
| the RE matches the one starting earliest in the string. | |
| If the RE could match more than one substring starting at that point, | |
| it matches the longest. | |
| Subexpressions also match the longest possible substrings, subject to | |
| the constraint that the whole match be as long as possible, | |
| with subexpressions starting earlier in the RE taking priority over | |
| ones starting later. | |
| Note that higher-level subexpressions thus take priority over | |
| their lower-level component subexpressions. | |
| .Pp | |
| Match lengths are measured in characters, not collating elements. | |
| A null string is considered longer than no match at all. | |
| For example, | |
| .Sq bb* | |
| matches the three middle characters of | |
| .Sq abbbc ; | |
| .Sq (wee|week)(knights|nights) | |
| matches all ten characters of | |
| .Sq weeknights ; | |
| when | |
| .Sq (.*).* | |
| is matched against | |
| .Sq abc , | |
| the parenthesized subexpression matches all three characters; | |
| and when | |
| .Sq (a*)* | |
| is matched against | |
| .Sq bc , | |
| both the whole RE and the parenthesized subexpression match the null string. | |
| .Pp | |
| If case-independent matching is specified, | |
| the effect is much as if all case distinctions had vanished from the | |
| alphabet. | |
| When an alphabetic that exists in multiple cases appears as an | |
| ordinary character outside a bracket expression, it is effectively | |
| transformed into a bracket expression containing both cases, | |
| e.g.\& | |
| .Sq x | |
| becomes | |
| .Sq [xX] . | |
| When it appears inside a bracket expression, | |
| all case counterparts of it are added to the bracket expression, | |
| so that, for example, | |
| .Sq [x] | |
| becomes | |
| .Sq [xX] | |
| and | |
| .Sq [^x] | |
| becomes | |
| .Sq [^xX] . | |
| .Pp | |
| No particular limit is imposed on the length of REs**. | |
| Programs intended to be portable should not employ REs longer | |
| than 256 bytes, | |
| as an implementation can refuse to accept such REs and remain | |
| POSIX-compliant. | |
| .Pp | |
| The following is a list of extended regular expressions: | |
| .Bl -tag -width Ds | |
| .It Ar c | |
| Any character | |
| .Ar c | |
| not listed below matches itself. | |
| .It \e Ns Ar c | |
| Any backslash-escaped character | |
| .Ar c | |
| matches itself. | |
| .It \&. | |
| Matches any single character that is not a newline | |
| .Pq Sq \en . | |
| .It Bq Ar char-class | |
| Matches any single character in | |
| .Ar char-class . | |
| To include a | |
| .Ql \&] | |
| in | |
| .Ar char-class , | |
| it must be the first character. | |
| A range of characters may be specified by separating the end characters | |
| of the range with a | |
| .Ql - ; | |
| e.g.\& | |
| .Ar a-z | |
| specifies the lower case characters. | |
| The following literal expressions can also be used in | |
| .Ar char-class | |
| to specify sets of characters: | |
| .Bd -unfilled -offset indent | |
| [:alnum:] [:cntrl:] [:lower:] [:space:] | |
| [:alpha:] [:digit:] [:print:] [:upper:] | |
| [:blank:] [:graph:] [:punct:] [:xdigit:] | |
| .Ed | |
| .Pp | |
| If | |
| .Ql - | |
| appears as the first or last character of | |
| .Ar char-class , | |
| then it matches itself. | |
| All other characters in | |
| .Ar char-class | |
| match themselves. | |
| .Pp | |
| Patterns in | |
| .Ar char-class | |
| of the form | |
| .Eo [. | |
| .Ar col-elm | |
| .Ec .]\& | |
| or | |
| .Eo [= | |
| .Ar col-elm | |
| .Ec =]\& , | |
| where | |
| .Ar col-elm | |
| is a collating element, are interpreted according to | |
| .Xr setlocale 3 | |
| .Pq not currently supported . | |
| .It Bq ^ Ns Ar char-class | |
| Matches any single character, other than newline, not in | |
| .Ar char-class . | |
| .Ar char-class | |
| is defined as above. | |
| .It ^ | |
| If | |
| .Sq ^ | |
| is the first character of a regular expression, then it | |
| anchors the regular expression to the beginning of a line. | |
| Otherwise, it matches itself. | |
| .It $ | |
| If | |
| .Sq $ | |
| is the last character of a regular expression, | |
| it anchors the regular expression to the end of a line. | |
| Otherwise, it matches itself. | |
| .It [[:<:]] | |
| Anchors the single character regular expression or subexpression | |
| immediately following it to the beginning of a word. | |
| .It [[:>:]] | |
| Anchors the single character regular expression or subexpression | |
| immediately following it to the end of a word. | |
| .It Pq Ar re | |
| Defines a subexpression | |
| .Ar re . | |
| Any set of characters enclosed in parentheses | |
| matches whatever the set of characters without parentheses matches | |
| (that is a long-winded way of saying the constructs | |
| .Sq (re) | |
| and | |
| .Sq re | |
| match identically). | |
| .It * | |
| Matches the single character regular expression or subexpression | |
| immediately preceding it zero or more times. | |
| If | |
| .Sq * | |
| is the first character of a regular expression or subexpression, | |
| then it matches itself. | |
| The | |
| .Sq * | |
| operator sometimes yields unexpected results. | |
| For example, the regular expression | |
| .Ar b* | |
| matches the beginning of the string | |
| .Qq abbb | |
| (as opposed to the substring | |
| .Qq bbb ) , | |
| since a null match is the only leftmost match. | |
| .It + | |
| Matches the singular character regular expression | |
| or subexpression immediately preceding it | |
| one or more times. | |
| .It ? | |
| Matches the singular character regular expression | |
| or subexpression immediately preceding it | |
| 0 or 1 times. | |
| .Sm off | |
| .It Xo | |
| .Pf { Ar n , m No }\ \& | |
| .Pf { Ar n , No }\ \& | |
| .Pf { Ar n No } | |
| .Xc | |
| .Sm on | |
| Matches the single character regular expression or subexpression | |
| immediately preceding it at least | |
| .Ar n | |
| and at most | |
| .Ar m | |
| times. | |
| If | |
| .Ar m | |
| is omitted, then it matches at least | |
| .Ar n | |
| times. | |
| If the comma is also omitted, then it matches exactly | |
| .Ar n | |
| times. | |
| .It \*(Ba | |
| Used to separate patterns. | |
| For example, | |
| the pattern | |
| .Sq cat\*(Badog | |
| matches either | |
| .Sq cat | |
| or | |
| .Sq dog . | |
| .El | |
| .Sh BASIC REGULAR EXPRESSIONS | |
| Basic regular expressions differ in several respects: | |
| .Bl -bullet -offset 3n | |
| .It | |
| .Sq \*(Ba , | |
| .Sq + , | |
| and | |
| .Sq ?\& | |
| are ordinary characters and there is no equivalent | |
| for their functionality. | |
| .It | |
| The delimiters for bounds are | |
| .Sq \e{ | |
| and | |
| .Sq \e} , | |
| with | |
| .Sq { | |
| and | |
| .Sq } | |
| by themselves ordinary characters. | |
| .It | |
| The parentheses for nested subexpressions are | |
| .Sq \e( | |
| and | |
| .Sq \e) , | |
| with | |
| .Sq ( | |
| and | |
| .Sq )\& | |
| by themselves ordinary characters. | |
| .It | |
| .Sq ^ | |
| is an ordinary character except at the beginning of the | |
| RE or** the beginning of a parenthesized subexpression. | |
| .It | |
| .Sq $ | |
| is an ordinary character except at the end of the | |
| RE or** the end of a parenthesized subexpression. | |
| .It | |
| .Sq * | |
| is an ordinary character if it appears at the beginning of the | |
| RE or the beginning of a parenthesized subexpression | |
| (after a possible leading | |
| .Sq ^ ) . | |
| .It | |
| Finally, there is one new type of atom, a | |
| .Em back-reference : | |
| .Sq \e | |
| followed by a non-zero decimal digit | |
| .Ar d | |
| matches the same sequence of characters matched by the | |
| .Ar d Ns th | |
| parenthesized subexpression | |
| (numbering subexpressions by the positions of their opening parentheses, | |
| left to right), | |
| so that, for example, | |
| .Sq \e([bc]\e)\e1 | |
| matches | |
| .Sq bb\& | |
| or | |
| .Sq cc | |
| but not | |
| .Sq bc . | |
| .El | |
| .Pp | |
| The following is a list of basic regular expressions: | |
| .Bl -tag -width Ds | |
| .It Ar c | |
| Any character | |
| .Ar c | |
| not listed below matches itself. | |
| .It \e Ns Ar c | |
| Any backslash-escaped character | |
| .Ar c , | |
| except for | |
| .Sq { , | |
| .Sq } , | |
| .Sq \&( , | |
| and | |
| .Sq \&) , | |
| matches itself. | |
| .It \&. | |
| Matches any single character that is not a newline | |
| .Pq Sq \en . | |
| .It Bq Ar char-class | |
| Matches any single character in | |
| .Ar char-class . | |
| To include a | |
| .Ql \&] | |
| in | |
| .Ar char-class , | |
| it must be the first character. | |
| A range of characters may be specified by separating the end characters | |
| of the range with a | |
| .Ql - ; | |
| e.g.\& | |
| .Ar a-z | |
| specifies the lower case characters. | |
| The following literal expressions can also be used in | |
| .Ar char-class | |
| to specify sets of characters: | |
| .Bd -unfilled -offset indent | |
| [:alnum:] [:cntrl:] [:lower:] [:space:] | |
| [:alpha:] [:digit:] [:print:] [:upper:] | |
| [:blank:] [:graph:] [:punct:] [:xdigit:] | |
| .Ed | |
| .Pp | |
| If | |
| .Ql - | |
| appears as the first or last character of | |
| .Ar char-class , | |
| then it matches itself. | |
| All other characters in | |
| .Ar char-class | |
| match themselves. | |
| .Pp | |
| Patterns in | |
| .Ar char-class | |
| of the form | |
| .Eo [. | |
| .Ar col-elm | |
| .Ec .]\& | |
| or | |
| .Eo [= | |
| .Ar col-elm | |
| .Ec =]\& , | |
| where | |
| .Ar col-elm | |
| is a collating element, are interpreted according to | |
| .Xr setlocale 3 | |
| .Pq not currently supported . | |
| .It Bq ^ Ns Ar char-class | |
| Matches any single character, other than newline, not in | |
| .Ar char-class . | |
| .Ar char-class | |
| is defined as above. | |
| .It ^ | |
| If | |
| .Sq ^ | |
| is the first character of a regular expression, then it | |
| anchors the regular expression to the beginning of a line. | |
| Otherwise, it matches itself. | |
| .It $ | |
| If | |
| .Sq $ | |
| is the last character of a regular expression, | |
| it anchors the regular expression to the end of a line. | |
| Otherwise, it matches itself. | |
| .It [[:<:]] | |
| Anchors the single character regular expression or subexpression | |
| immediately following it to the beginning of a word. | |
| .It [[:>:]] | |
| Anchors the single character regular expression or subexpression | |
| immediately following it to the end of a word. | |
| .It \e( Ns Ar re Ns \e) | |
| Defines a subexpression | |
| .Ar re . | |
| Subexpressions may be nested. | |
| A subsequent backreference of the form | |
| .Pf \e Ns Ar n , | |
| where | |
| .Ar n | |
| is a number in the range [1,9], expands to the text matched by the | |
| .Ar n Ns th | |
| subexpression. | |
| For example, the regular expression | |
| .Ar \e(.*\e)\e1 | |
| matches any string consisting of identical adjacent substrings. | |
| Subexpressions are ordered relative to their left delimiter. | |
| .It * | |
| Matches the single character regular expression or subexpression | |
| immediately preceding it zero or more times. | |
| If | |
| .Sq * | |
| is the first character of a regular expression or subexpression, | |
| then it matches itself. | |
| The | |
| .Sq * | |
| operator sometimes yields unexpected results. | |
| For example, the regular expression | |
| .Ar b* | |
| matches the beginning of the string | |
| .Qq abbb | |
| (as opposed to the substring | |
| .Qq bbb ) , | |
| since a null match is the only leftmost match. | |
| .Sm off | |
| .It Xo | |
| .Pf \e{ Ar n , m No \e}\ \& | |
| .Pf \e{ Ar n , No \e}\ \& | |
| .Pf \e{ Ar n No \e} | |
| .Xc | |
| .Sm on | |
| Matches the single character regular expression or subexpression | |
| immediately preceding it at least | |
| .Ar n | |
| and at most | |
| .Ar m | |
| times. | |
| If | |
| .Ar m | |
| is omitted, then it matches at least | |
| .Ar n | |
| times. | |
| If the comma is also omitted, then it matches exactly | |
| .Ar n | |
| times. | |
| .El | |
| .Sh SEE ALSO | |
| .Xr ctype 3 , | |
| .Xr regex 3 | |
| .Sh STANDARDS | |
| .St -p1003.1-2004 : | |
| Base Definitions, Chapter 9 (Regular Expressions). | |
| .Sh BUGS | |
| Having two kinds of REs is a botch. | |
| .Pp | |
| The current POSIX spec says that | |
| .Sq )\& | |
| is an ordinary character in the absence of an unmatched | |
| .Sq ( ; | |
| this was an unintentional result of a wording error, | |
| and change is likely. | |
| Avoid relying on it. | |
| .Pp | |
| Back-references are a dreadful botch, | |
| posing major problems for efficient implementations. | |
| They are also somewhat vaguely defined | |
| (does | |
| .Sq a\e(\e(b\e)*\e2\e)*d | |
| match | |
| .Sq abbbd ? ) . | |
| Avoid using them. | |
| .Pp | |
| POSIX's specification of case-independent matching is vague. | |
| The | |
| .Dq one case implies all cases | |
| definition given above | |
| is the current consensus among implementors as to the right interpretation. | |
| .Pp | |
| The syntax for word boundaries is incredibly ugly. |