REGEX - Linux手册页
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的指针,这些标志用于确定编译类型。
所有正则表达式搜索都必须通过已编译的模式缓冲区来完成,因此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)。
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。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。