REGEX - Linux手册页

时间:2019-08-20 18:01:10  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2020-08-13

名称

regcomp,regexec,regerror,regfree-POSIX正则函数

语法

#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()用于将正则表达式编译为适合后续regexec()搜索的形式。

regcomp()带有preg,即指向模式缓冲区存储区域的指针; regex,指向以null结束的字符串和cflags的指针,cflags用于确定编译类型。

所有正则表达式搜索都必须通过已编译的模式缓冲区来完成,因此regexec()必须始终提供regcomp()初始化的模式缓冲区的地址。

cflags可以是以下各项的按位或零或多个:

REG_EXTENDED
解释正则表达式时,请使用POSIX扩展正则表达式语法。如果未设置,则使用POSIX基本正则表达式语法。
REG_ICASE
不要区分大小写。随后使用此模式缓冲区的regexec()搜索将不区分大小写。
REG_NOSUB
不报告比赛位置。如果提供的模式缓冲区是使用此标志集编译的,则忽略regexec()的nmatch和pmatch参数。
REG_NEWLINE
任意字符匹配运算符不匹配换行符。
不包含换行符的不匹配列表([ha ...])与换行符不匹配。
行匹配项起始符(ha)在换行符后立即匹配空字符串,无论eflags(regexec()的执行标志)是否包含REG_NOTBOL。
行尾匹配符($)匹配换行符前的空字符串,无论eflags是否包含REG_NOTEOL。

POSIX regex matching

regexec()用于将空终止的字符串与预编译的模式缓冲区preg进行匹配。 nmatch和pmatch用于提供有关任何匹配位置的信息。 eflags可以是REG_NOTBOL和REG_NOTEOL之一或两者的按位或任一或二者,这将导致以下所述的匹配行为发生变化。

REG_NOTBOL
匹配行开始符始终不匹配(但请参见上面的编译标志REG_NEWLINE)。当将字符串的不同部分传递给regexec()时,可以使用此标志,并且不应将字符串的开头解释为行的开头。
REG_NOTEOL
匹配行尾运算符始终无法匹配(但请参见上面的编译标志REG_NEWLINE)。
REG_STARTEND
在输入字符串上使用pmatch [0],从字节pmatch [0] .rm_so开始到字节pmatch [0] .rm_eo之前结束。这允许匹配嵌入的NUL字节,并避免在大字符串上使用strlen(3)。它不对输入使用nmatch,并且不更改REG_NOTBOL或REG_NEWLINE处理。该标志是BSD扩展,在POSIX中不存在。

Byte offsets

除非为模式缓冲区的编译设置了REG_NOSUB,否则有可能获得匹配的寻址信息。 pmatch的大小必须至少包含nmatch元素。这些由regexec()用子字符串匹配地址填充。从第i个右括号开始的子表达式的偏移量存储在pmatch [i]中。整个正则表达式的匹配地址存储在pmatch [0]中。 (请注意,要返回N个子表达式匹配的偏移量,nmatch必须至少为N + 1。)任何未使用的结构元素将包含值-1。

pmatch类型的regmatch_t结构在中定义。

typedef struct {
    regoff_t rm_so;
    regoff_t rm_eo;
} regmatch_t;

每个不为-1的rm_so元素表示字符串中下一个最大子字符串匹配项的起始偏移量。相对的rm_eo元素指示匹配的结束偏移,即匹配文本之后的第一个字符的偏移。

POSIX error reporting

regerror()用于将regcomp()和regexec()都可以返回的错误代码转换为错误消息字符串。

regerror()传递了错误代码errcode,模式缓冲区preg,指向字符串缓冲区的指针errbuf以及字符串缓冲区的大小errbuf_size。它返回包含以空字符结尾的错误消息字符串所需的errbuf的大小。如果errbuf和errbuf_size都不为零,则errbuf会填充第一个errbuf_size-错误消息的1个字符和一个终止的空字节(aq \ 0aq)。

POSIX pattern buffer freeing

regfree()提供一个预编译的模式缓冲区,preg将释放编译过程regcomp()分配给模式缓冲区的内存。

返回值

regcomp()对于成功的编译将返回零,对于失败的则返回错误代码。

regexec()对于成功的匹配返回零,对于失败的则返回REG_NOMATCH。

错误说明

regcomp()可以返回以下错误:

REG_BADBR
无效使用反向引用运算符。
REG_BADPAT
无效使用模式运算符,例如组或列表。
REG_BADRPT
无效使用重复运算符,例如使用aq * aq作为第一个字符。
REG_EBRACE
不匹配的括号间隔运算符。
REG_EBRACK
括号列表运算符不匹配。
REG_ECOLLATE
无效的整理元素。
REG_ECTYPE
未知的字符类名称。
REG_EEND
非特定错误。这不是POSIX.2定义的。
REG_EESCAPE
尾随反斜杠。
REG_EPAREN
括号组运算符不匹配。
REG_ERANGE
无效使用范围运算符;例如,范围的终点位于起点之前。
REG_ESIZE
编译的正则表达式需要大于64 kB的模式缓冲区。这不是POSIX.2定义的。
REG_ESPACE
正则表达式例程内存不足。
REG_ESUBREG
对子表达式的反向引用无效。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
regcomp(),regexec()Thread safetyMT-Safe locale
regerror()Thread safetyMT-Safe env
regfree()Thread safetyMT-Safe

遵循规范

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

另外参见

grep(1),正则表达式(7)

glibc手册部分,正则表达式

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/