#include <regex.h>
|
int
regcomp (regex_t * restrict preg, const char * restrict pattern, int cflags); |
int
regexec (const regex_t * restrict preg, const char * restrict string, size_t nmatch, regmatch_t pmatch[restrict], int eflags); |
size_t
regerror (int errcode, const regex_t * restrict preg, char * restrict errbuf, size_t errbuf_size); |
void
regfree (regex_t *preg); |
regcomp function returns zero for a successful compilation or an error code for failure.
regexec function returns zero for a successful match or REG_NOMATCH for failure.
The header
#include <regex.h> declares two structure types,
|
regex_t and |
regmatch_t, the former for compiled internal forms and the latter for match reporting. It also declares the four functions, a type |
regoff_t,
and a number of constants with names starting with
"REG_."
The regcomp function compiles the regular expression contained in the pattern string, subject to the flags in cflags, and places the results in the |
regex_t
structure pointed to by
preg.
The
cflags
argument
is the bitwise OR of zero or more of the following flags:
When successful, regcomp returns 0 and fills in the structure pointed to by preg. One member of that structure (other than re_endp) is publicized: re_nsub, of type |
size_t,
contains the number of parenthesized subexpressions within the RE
(except that the value of this member is undefined if the
REG_NOSUB
flag was used).
If
regcomp
fails, it returns a non-zero error code;
see
DIAGNOSTICS.
The regexec function matches the compiled RE pointed to by preg against the string, subject to the flags in eflags, and reports results using nmatch, pmatch, and the returned value. The RE must have been compiled by a previous invocation of regcomp. The compiled form is not altered during execution of regexec, so a single compiled RE can be used simultaneously by multiple threads. By default, the NUL-terminated string pointed to by string is considered to be the text of an entire line, minus any terminating newline. The eflags argument is the bitwise OR of zero or more of the following flags:
Normally, regexec returns 0 for success and the non-zero code REG_NOMATCH for failure. Other non-zero error codes may be returned in exceptional situations; see DIAGNOSTICS. If REG_NOSUB was specified in the compilation of the RE, or if nmatch is 0, regexec ignores the pmatch argument (but see below for the case where REG_STARTEND is specified). Otherwise, pmatch points to an array of nmatch structures of type |
regmatch_t. Such a structure has at least the members rm_so and rm_eo, both of type |
regoff_t (a signed arithmetic type at least as large as an |
off_t and a |
ssize_t),
containing respectively the offset of the first character of a substring
and the offset of the first character after the end of the substring.
Offsets are measured from the beginning of the
string
argument given to
regexec.
An empty substring is denoted by equal offsets,
both indicating the character following the empty substring.
The 0th member of the pmatch array is filled in to indicate what substring of string was matched by the entire RE. Remaining members report what substring was matched by parenthesized subexpressions within the RE; member i reports subexpression i, with subexpressions counted (starting at 1) by the order of their opening parentheses in the RE, left to right. Unused entries in the array (corresponding either to subexpressions that did not participate in the match at all, or to subexpressions that do not exist in the RE (that is, i > preg -> re_nsub)) have both rm_so and rm_eo set to -1. If a subexpression participated in the match several times, the reported substring is the last one it matched. (Note, as an example in particular, that when the RE ‘(b*)+’ matches ‘bbb,’ the parenthesized subexpression matches each of the three 'bs' and then an infinite number of empty strings following the last ‘b,’ so the reported substring is one of the empties.) If REG_STARTEND is specified, pmatch must point to at least one |
regmatch_t
(even if
nmatch
is 0 or
REG_NOSUB
was specified),
to hold the input offsets for
REG_STARTEND.
Use for output is still entirely controlled by
nmatch;
if
nmatch
is 0 or
REG_NOSUB
was specified,
the value of
pmatch [0]
will not be changed by a successful
regexec.
The regerror function maps a non-zero errcode from either regcomp or regexec to a human-readable, printable message. If preg is non- NULL, the error code should have arisen from use of the |
regex_t pointed to by preg, and if the error code came from regcomp, it should have been the result from the most recent regcomp using that |
regex_t.
The
( (regerror); may be able to supply a more detailed message using information from the |
regex_t.)
The
regerror
function
places the NUL-terminated message into the buffer pointed to by
errbuf,
limiting the length (including the NUL) to at most
errbuf_size
bytes.
If the whole message will not fit,
as much of it as will fit before the terminating NUL is supplied.
In any case,
the returned value is the size of buffer needed to hold the whole
message (including terminating NUL).
If
errbuf_size
is 0,
errbuf
is ignored but the return value is still correct.
If the errcode given to regerror is first ORed with REG_ITOA, the "message" that results is the printable name of the error code, e.g. "REG_NOMATCH," rather than an explanation thereof. If errcode is REG_ATOI, then preg shall be non- NULL and the re_endp member of the structure it points to must point to the printable name of an error code; in this case, the result in errbuf is the decimal digits of the numeric value of the error code (0 if the name is not recognized). REG_ITOA and REG_ATOI are intended primarily as debugging facilities The regfree function frees any dynamically-allocated storage associated with the compiled RE pointed to by preg. The remaining |
regex_t
is no longer a valid compiled RE
and the effect of supplying it to
regexec
or
regerror
is undefined.
None of these functions references global variables except for tables of constants; all are safe for use from multiple threads if the arguments are safe. |
#include <stdio.h> #include <regex.h> int main() { int ret,match=0; regex_t re; char errbuf[256]; ret=regcomp(&re,"[a-c]",REG_EXTENDED|REG_NOSUB); if(ret) { regerror(ret,&re,errbuf,sizeof(errbuf)); printf("compilation failed with error %s\n",errbuf); } else { match=regexec(&re,"access.txt|log.txt|passwd.txt",0,NULL,0); if(!match) printf("match found\n"); else printf("match not found"); regfree(&re); } return 0; }
Output
match found
Any unmatched ‘[’ is a REG_EBRACK error.
Equivalence classes cannot begin or end bracket-expression ranges. The endpoint of one range cannot begin another.
RE_DUP_MAX, the limit on repetition counts in bounded repetitions, is 255.
A repetition operator ‘(?,’ ‘*,’ ‘+,’ or bounds) cannot follow another repetition operator. A repetition operator cannot begin an expression or subexpression or follow ‘^’ or ‘|.’
‘|’ cannot appear first or last in a (sub)expression or after another ‘|,’ i.e., an operand of ‘|’ cannot be an empty subexpression. An empty parenthesized subexpression, ‘()’, is legal and matches an empty (sub)string. An empty string is not a legal RE.
A ‘{’ followed by a digit is considered the beginning of bounds for a bounded repetition, which must then follow the syntax for bounds. A ‘{’ not followed by a digit is considered an ordinary character.
‘^’ and ‘$’ beginning and ending subexpressions in obsolete ("basic") REs are anchors, not ordinary characters.
REG_NOMATCH | The regexec function failed to match |
REG_BADPAT | invalid regular expression |
REG_ECOLLATE | |
invalid collating element | |
REG_ECTYPE | invalid character class |
REG_EESCAPE | ‘\’ applied to unescapable character |
REG_ESUBREG | invalid backreference number |
REG_EBRACK | brackets ‘[ ]’ not balanced |
REG_EPAREN | parentheses ‘( )’ not balanced |
REG_EBRACE | braces ‘{ }’ not balanced |
REG_BADBR | invalid repetition count(s) in ‘{ }’ |
REG_ERANGE | invalid character range in ‘[ ]’ |
REG_ESPACE | ran out of memory |
REG_BADRPT | ‘?,’ ‘*,’ or ‘+’ operand invalid |
REG_EMPTY | empty (sub)expression |
REG_ASSERT | cannot happen - found a bug |
REG_INVARG | invalid argument, e.g. negative-length string |
REG_ILLSEQ | illegal byte sequence (bad multibyte character) |
© 2005-2007 Nokia |