Section (3) regex
Name
regcomp, regexec, regerror, regfree — POSIX regex functions
Synopsis
#include <sys/types.h> #include <regex.h>
int
regcomp( |
regex_t *preg, |
const char *regex, | |
int cflags) ; |
int
regexec( |
const regex_t *preg, |
const char *string, | |
size_t nmatch, | |
regmatch_t pmatch[], | |
int eflags) ; |
size_t
regerror( |
int errcode, |
const regex_t *preg, | |
char *errbuf, | |
size_t errbuf_size) ; |
void
regfree( |
regex_t *preg) ; |
DESCRIPTION
POSIX regex compiling
regcomp
() is used to
compile a regular expression into a form that is suitable
for subsequent regexec
()
searches.
regcomp
() is supplied with
preg
, a pointer to
a pattern buffer storage area; regex
, a pointer to the
null-terminated string and cflags
, flags used to
determine the type of compilation.
All regular expression searching must be done via a
compiled pattern buffer, thus regexec
() must always be supplied with
the address of a regcomp
()
initialized pattern buffer.
cflags
may be
the bitwise-or of
zero or more of the following:
REG_EXTENDED
-
Use
POSIX
Extended Regular Expression syntax when interpretingregex
. If not set,POSIX
Basic Regular Expression syntax is used. REG_ICASE
-
Do not differentiate case. Subsequent
regexec
() searches using this pattern buffer will be case insensitive. REG_NOSUB
-
Do not report position of matches. The
nmatch
andpmatch
arguments toregexec
() are ignored if the pattern buffer supplied was compiled with this flag set. REG_NEWLINE
-
Match-any-character operators don_zsingle_quotesz_t match a newline.
A nonmatching list (
[^...]
) not containing a newline does not match a newline.Match-beginning-of-line operator (
^
) matches the empty string immediately after a newline, regardless of whethereflags
, the execution flags ofregexec
(), containsREG_NOTBOL
.Match-end-of-line operator (
$
) matches the empty string immediately before a newline, regardless of whethereflags
containsREG_NOTEOL
.
POSIX regex matching
regexec
() is used to match
a null-terminated string against the precompiled pattern
buffer, preg
.
nmatch
and
pmatch
are used to
provide information regarding the location of any matches.
eflags
may be the
bitwise-or of one or
both of REG_NOTBOL
and
REG_NOTEOL
which cause
changes in matching behavior described below.
REG_NOTBOL
-
The match-beginning-of-line operator always fails to match (but see the compilation flag
REG_NEWLINE
above). This flag may be used when different portions of a string are passed toregexec
() and the beginning of the string should not be interpreted as the beginning of the line. REG_NOTEOL
-
The match-end-of-line operator always fails to match (but see the compilation flag
REG_NEWLINE
above). REG_STARTEND
-
Use
pmatch[0]
on the input string, starting at bytepmatch[0].rm_so
and ending before bytepmatch[0].rm_eo
. This allows matching embedded NUL bytes and avoids a strlen(3) on large strings. It does not usenmatch
on input, and does not changeREG_NOTBOL
orREG_NEWLINE
processing. This flag is a BSD extension, not present in POSIX.
Byte offsets
Unless REG_NOSUB
was set
for the compilation of the pattern buffer, it is possible
to obtain match addressing information. pmatch
must be dimensioned to
have at least nmatch
elements. These are
filled in by regexec
() with
substring match addresses. The offsets of the subexpression
starting at the i
th open
parenthesis are stored in pmatch[i]
. The entire
regular expression_zsingle_quotesz_s match addresses are stored in
pmatch[0]
. (Note
that to return the offsets of N
subexpression matches, nmatch
must be at least
N+1
.) Any unused
structure elements will contain the value −1.
The regmatch_t structure which
is the type of pmatch
is defined in
<
regex.h
>
typedef struct { regoff_t rm_so
;regoff_t rm_eo
;} regmatch_t;
Each rm_so
element that is not −1 indicates the start offset of
the next largest substring match within the string. The
relative rm_eo
element indicates the end offset of the match, which is the
offset of the first character after the matching text.
POSIX error reporting
regerror
() is used to turn
the error codes that can be returned by both regcomp
() and regexec
() into error message strings.
regerror
() is passed the
error code, errcode
, the pattern buffer,
preg
, a pointer to
a character string buffer, errbuf
, and the size of the
string buffer, errbuf_size
. It returns the
size of the errbuf
required to contain the null-terminated error message
string. If both errbuf
and errbuf_size
are nonzero,
errbuf
is filled in
with the first errbuf_size
− 1 characters of the error message and a
terminating null byte (_zsingle_quotesz_ _zsingle_quotesz_).
RETURN VALUE
regcomp
() returns zero for a
successful compilation or an error code for failure.
regexec
() returns zero for a
successful match or REG_NOMATCH
for failure.
ERRORS
The following errors can be returned by regcomp
():
REG_BADBR
-
Invalid use of back reference operator.
REG_BADPAT
-
Invalid use of pattern operators such as group or list.
REG_BADRPT
-
Invalid use of repetition operators such as using _zsingle_quotesz_*_zsingle_quotesz_ as the first character.
REG_EBRACE
-
Un-matched brace interval operators.
REG_EBRACK
-
Un-matched bracket list operators.
REG_ECOLLATE
-
Invalid collating element.
REG_ECTYPE
-
Unknown character class name.
REG_EEND
-
Nonspecific error. This is not defined by POSIX.2.
REG_EESCAPE
-
Trailing backslash.
REG_EPAREN
-
Un-matched parenthesis group operators.
REG_ERANGE
-
Invalid use of the range operator; for example, the ending point of the range occurs prior to the starting point.
REG_ESIZE
-
Compiled regular expression requires a pattern buffer larger than 64 kB. This is not defined by POSIX.2.
REG_ESPACE
-
The regex routines ran out of memory.
REG_ESUBREG
-
Invalid back reference to a subexpression.
ATTRIBUTES
For an explanation of the terms used in this section, see attributes(7).
Interface | Attribute | Value |
regcomp (), regexec () |
Thread safety | MT-Safe locale |
regerror () |
Thread safety | MT-Safe env |
regfree () |
Thread safety | MT-Safe |
COLOPHON
This page is part of release 5.04 of the Linux man-pages
project. A
description of the project, information about reporting bugs,
and the latest version of this page, can be found at
https://www.kernel.org/doc/man−pages/.
Copyright (C), 1995, Graeme W. Wilford. (Wilf.) %%%LICENSE_START(VERBATIM) Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Since the Linux kernel and libraries are constantly changing, this manual page may be incorrect or out-of-date. The author(s) assume no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein. The author(s) may not have taken the same level of care in the production of this manual, which is licensed free of charge, as they might when working professionally. Formatted or processed versions of this manual, if unaccompanied by the source, must acknowledge the copyright and authors of this work. %%%LICENSE_END Wed Jun 14 16:10:28 BST 1995 Wilf. (G.Wilfordee.surrey.ac.uk) Tiny change in formatting - aeb, 950812 Modified 8 May 1998 by Joseph S. Myers (jsm28cam.ac.uk) show the synopsis section nicely |
Section (7) regex
Name
regex — POSIX.2 regular expressions
DESCRIPTION
Regular expressions (REs), as defined in POSIX.2, come
in two forms: modern REs (roughly those of egrep
; POSIX.2 calls these
extended REs) and obsolete REs (roughly those of
ed(1); POSIX.2 basic REs).
Obsolete REs mostly exist for backward compatibility in some
old programs; they will be discussed at the end. POSIX.2
leaves some aspects of RE syntax and semantics open;
‡ marks decisions on these aspects that may not be
fully portable to other POSIX.2 implementations.
A (modern) RE is one‡ or more nonempty‡
branches
, separated
by _zsingle_quotesz_|_zsingle_quotesz_. It matches anything that matches one of the
branches.
A branch is one‡ or more pieces
, concatenated. It
matches a match for the first, followed by a match for the
second, and so on.
A piece is an atom
possibly followed by a
single‡ _zsingle_quotesz_*_zsingle_quotesz_, _zsingle_quotesz_+_zsingle_quotesz_, _zsingle_quotesz_?_zsingle_quotesz_, or bound
. An atom followed by
_zsingle_quotesz_*_zsingle_quotesz_ matches a sequence of 0 or more matches of the atom. An
atom followed by _zsingle_quotesz_+_zsingle_quotesz_ matches a sequence of 1 or more matches
of the atom. An atom followed by _zsingle_quotesz_?_zsingle_quotesz_ matches a sequence of 0
or 1 matches of the atom.
A bound
is _zsingle_quotesz_{_zsingle_quotesz_
followed by an unsigned decimal integer, possibly followed by
_zsingle_quotesz_,_zsingle_quotesz_ possibly followed by another unsigned decimal integer,
always followed by _zsingle_quotesz_}_zsingle_quotesz_. The integers must lie between 0 and
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 i
and no
comma matches a sequence of exactly i
matches of the atom. An
atom followed by a bound containing one integer i
and a comma matches a
sequence of i
or
more matches of the atom. An atom followed by a bound
containing two integers i
and j
matches a sequence of
i
through
j
(inclusive)
matches of the atom.
An atom is a regular expression enclosed in () (matching
a match for the regular expression), an empty set of ()
(matching the null string)‡, a bracket expression (see below),
_zsingle_quotesz_._zsingle_quotesz_ (matching any single character), _zsingle_quotesz_^_zsingle_quotesz_ (matching the null
string at the beginning of a line), _zsingle_quotesz_$_zsingle_quotesz_ (matching the null
string at the end of a line), a _zsingle_quotesz_\_zsingle_quotesz_ followed by one of the
characters ^.[$
()|*+?{\
(matching that character taken as an ordinary character), a
_zsingle_quotesz_\_zsingle_quotesz_ followed by any other character‡ (matching that
character taken as an ordinary character, as if the _zsingle_quotesz_\_zsingle_quotesz_ had
not been present‡), or a single character with no
other significance (matching that character). A _zsingle_quotesz_{_zsingle_quotesz_ 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 _zsingle_quotesz_\_zsingle_quotesz_.
A bracket
expression is a list of characters enclosed in
[]
. It normally
matches any single character from the list (but see below).
If the list begins with _zsingle_quotesz_^_zsingle_quotesz_, it matches any single character
(but see below) not
from the rest of the list. If two characters in the list are
separated by _zsingle_quotesz_−_zsingle_quotesz_, this is shorthand for the full
range
of characters
between those two (inclusive) in the collating sequence, for
example, [0−9]
in ASCII matches
any decimal digit. It is illegal‡ for two ranges to
share an endpoint, for example, a−c−e
. Ranges
are very collating-sequence-dependent, and portable programs
should avoid relying on them.
To include a literal _zsingle_quotesz_]_zsingle_quotesz_ in the list, make it the first
character (following a possible _zsingle_quotesz_^_zsingle_quotesz_). To include a literal
_zsingle_quotesz_−_zsingle_quotesz_, make it the first or last character, or the second
endpoint of a range. To use a literal _zsingle_quotesz_−_zsingle_quotesz_ as the first
endpoint of a range, enclose it in [.
and .]
to make it a collating
element (see below). With the exception of these and some
combinations using _zsingle_quotesz_[_zsingle_quotesz_ (see next paragraphs), all other
special characters, including _zsingle_quotesz_\_zsingle_quotesz_, lose their special
significance within a bracket expression.
Within a bracket expression, a collating element (a
character, a multicharacter sequence that collates as if it
were a single character, or a collating-sequence name for
either) enclosed in [.
and .]
stands for the sequence
of characters of that collating element. The sequence is a
single element of the bracket expression_zsingle_quotesz_s list. A bracket
expression containing a multicharacter collating element can
thus match more than one character, for example, if the
collating sequence includes a ch collating element, then
the RE [[.ch.]]*c
matches the first five characters of chchcc.
Within a bracket expression, a collating element enclosed
in [=
and
=]
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
[.
and
.]
.) For example,
if o and ^ are the members of an equivalence class, then
[[=o=]]
,
[[=^=]]
, and
[o^]
are all
synonymous. An equivalence class may not‡ be an
endpoint of a range.
Within a bracket expression, the name of a character class enclosed in
[:
and
:]
stands for the
list of all characters belonging to that class. Standard
character class names are:
alnum digit punct alpha graph space blank lower upper cntrl xdigit
These stand for the character classes defined in wctype(3). A locale may provide others. A character class may not be used as an endpoint of a range.
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.
Match lengths are measured in characters, not collating
elements. A null string is considered longer than no match at
all. For example, bb*
matches the three middle
characters of abbbc, (wee|week)(knights|nights)
matches all ten characters of weeknights, when (.*).*
is matched against
abc the parenthesized subexpression matches all three
characters, and when (a*)*
is matched against
bc both the whole RE and the parenthesized subexpression
match the null string.
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, for example, _zsingle_quotesz_x_zsingle_quotesz_ becomes
[xX]
. When it
appears inside a bracket expression, all case counterparts of
it are added to the bracket expression, so that, for example,
[x]
becomes
[xX]
and
[^x]
becomes
[^xX]
.
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.
Obsolete (basic) regular expressions differ in several
respects. _zsingle_quotesz_|_zsingle_quotesz_, _zsingle_quotesz_+_zsingle_quotesz_, and _zsingle_quotesz_?_zsingle_quotesz_ are ordinary characters and there
is no equivalent for their functionality. The delimiters for
bounds are {
and
}
, with _zsingle_quotesz_{_zsingle_quotesz_ and
_zsingle_quotesz_}_zsingle_quotesz_ by themselves ordinary characters. The parentheses for
nested subexpressions are (
and )
, with _zsingle_quotesz_(_zsingle_quotesz_ and _zsingle_quotesz_)_zsingle_quotesz_ by
themselves ordinary characters. _zsingle_quotesz_^_zsingle_quotesz_ is an ordinary character
except at the beginning of the RE or‡ the beginning of
a parenthesized subexpression, _zsingle_quotesz_$_zsingle_quotesz_ is an ordinary character
except at the end of the RE or‡ the end of a
parenthesized subexpression, and _zsingle_quotesz_*_zsingle_quotesz_ is an ordinary character
if it appears at the beginning of the RE or the beginning of
a parenthesized subexpression (after a possible leading
_zsingle_quotesz_^_zsingle_quotesz_).
Finally, there is one new type of atom, a back reference: _zsingle_quotesz_\_zsingle_quotesz_ followed by a
nonzero decimal digit d
matches the same sequence
of characters matched by the d
th parenthesized
subexpression (numbering subexpressions by the positions of
their opening parentheses, left to right), so that, for
example, ([bc])1
matches bb or
cc but not bc.
BUGS
Having two kinds of REs is a botch.
The current POSIX.2 spec says that _zsingle_quotesz_)_zsingle_quotesz_ is an ordinary character in the absence of an unmatched _zsingle_quotesz_(_zsingle_quotesz_; this was an unintentional result of a wording error, and change is likely. Avoid relying on it.
Back references are a dreadful botch, posing major
problems for efficient implementations. They are also
somewhat vaguely defined (does a((b)*2)*d
match
abbbd?). Avoid using them.
POSIX.2_zsingle_quotesz_s specification of case-independent matching is vague. The one case implies all cases definition given above is current consensus among implementors as to the right interpretation.
COLOPHON
This page is part of release 4.16 of the Linux man-pages
project. A
description of the project, information about reporting bugs,
and the latest version of this page, can be found at
https://www.kernel.org/doc/man−pages/.
From Henry Spencer_zsingle_quotesz_s regex package (as found in the apache distribution). The package carries the following copyright: Copyright 1992, 1993, 1994 Henry Spencer. All rights reserved. %%%LICENSE_START(MISC) This software is not subject to any license of the American Telephone and Telegraph Company or of the Regents of the University of California. Permission is granted to anyone to use this software for any purpose on any computer system, and to alter it and redistribute it, subject to the following restrictions: 1. The author is not responsible for the consequences of use of this software, no matter how awful, even if they arise from flaws in it. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. Since few users ever read sources, credits must appear in the documentation. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. Since few users ever read sources, credits must appear in the documentation. 4. This notice may not be removed or altered. %%%LICENSE_END In order to comply with `credits must appear in the documentation_zsingle_quotesz_ I added an AUTHOR paragraph below - aeb. In the default nroff environment there is no dagger (dg. 2005-05-11 Removed discussion of `[[:<:]]_zsingle_quotesz_ and `[[:>:]]_zsingle_quotesz_, which appear not to be in the glibc implementation of regcomp |