Section (3) regex

Linux manual pages Section 3  


regcomp, regexec, regerror, regfree — POSIX regex functions


#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);


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:


Use POSIX Extended Regular Expression syntax when interpreting regex. If not set, POSIX Basic Regular Expression syntax is used.


Do not differentiate case. Subsequent regexec() searches using this pattern buffer will be case insensitive.


Do not report position of matches. The nmatch and pmatch arguments to regexec() are ignored if the pattern buffer supplied was compiled with this flag set.


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 whether eflags, the execution flags of regexec(), contains REG_NOTBOL.

Match-end-of-line operator ($) matches the empty string immediately before a newline, regardless of whether eflags contains REG_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.


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 to regexec() and the beginning of the string should not be interpreted as the beginning of the line.


The match-end-of-line operator always fails to match (but see the compilation flag REG_NEWLINE above).


Use pmatch[0] on the input string, starting at byte pmatch[0].rm_so and ending before byte pmatch[0].rm_eo. This allows matching embedded NUL bytes and avoids a strlen(3) on large strings. It does not use nmatch on input, and does not change REG_NOTBOL or REG_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 ith 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_).

POSIX pattern buffer freeing

Supplying regfree() with a precompiled pattern buffer, preg will free the memory allocated to the pattern buffer by the compiling process, regcomp().


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.


The following errors can be returned by regcomp():


Invalid use of back reference operator.


Invalid use of pattern operators such as group or list.


Invalid use of repetition operators such as using _zsingle_quotesz_*_zsingle_quotesz_ as the first character.


Un-matched brace interval operators.


Un-matched bracket list operators.


Invalid collating element.


Unknown character class name.


Nonspecific error. This is not defined by POSIX.2.


Trailing backslash.


Un-matched parenthesis group operators.


Invalid use of the range operator; for example, the ending point of the range occurs prior to the starting point.


Compiled regular expression requires a pattern buffer larger than 64 kB. This is not defined by POSIX.2.


The regex routines ran out of memory.


Invalid back reference to a subexpression.


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


POSIX.1-2001, POSIX.1-2008.


grep(1), regex(7)

The glibc manual section, Regular Expressions


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−pages/.

  Copyright (C), 1995, Graeme W. Wilford. (Wilf.)

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

Formatted or processed versions of this manual, if unaccompanied by
the source, must acknowledge the copyright and authors of this work.

Wed Jun 14 16:10:28 BST 1995 Wilf. (
Tiny change in formatting - aeb, 950812
Modified 8 May 1998 by Joseph S. Myers (

show the synopsis section nicely

Section (7) regex

Linux manual pages Section 7  


regex — POSIX.2 regular expressions


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 print 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 dth 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.


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.


This page was taken from Henry Spencer_zsingle_quotesz_s regex package.


grep(1), regex(3)

POSIX.2, section 2.8 (Regular Expression Notation).


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−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.
 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.

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