14个版本
| 0.3.8 | 2024年3月27日 |
|---|---|
| 0.3.7 | 2023年11月1日 |
| 0.3.6 | 2023年6月7日 |
| 0.3.4 | 2022年11月23日 |
| 0.2.0 | 2020年11月6日 |
#29 in Windows APIs
325KB
8K SLoC
包含 (autotools混淆代码,120KB) libgnurx/configure,(autoconf混淆代码,4KB) libgnurx/configure.ac
gnurx-sys:对 libgnurx 的不安全Rust绑定
这是从 glibc 提取的正则表达式功能,作为独立的库,用于Win32。请参阅C库的 README。
regcomp(),regexec(),regerror() 和 regfree() 是POSIX正则表达式函数。它们符合 POSIX.1-2001 和 POSIX.1-2008 标准。它们定义如下
extern "C" {
pub fn regcomp(
preg: *mut regex_t,
pattern: *const c_char,
cflags: c_int,
) -> c_int;
pub fn regexec(
preg: *const regex_t,
string: *const c_char,
nmatch: usize,
pmatch: *mut regmatch_t,
eflags: c_int,
) -> c_int;
pub fn regerror(
errcode: c_int,
preg: *const regex_t,
errbuf: *mut c_char,
errbuf_size: usize,
) -> usize;
pub fn regfree(preg: *mut regex_t);
}
POSIX正则表达式编译
regcomp() 用于将正则表达式编译成适合后续 regexec() 搜索的形式。
regcomp() 使用 preg,一个指向模式缓冲存储区域的指针;pattern,一个指向以null结尾的字符串的指针和 cflags,用于确定编译类型的标志。
所有正则表达式搜索都必须通过编译后的模式缓冲区进行,因此必须始终为 regexec() 提供由 regcomp() 初始化的模式缓冲区的地址。
cflags 可以是以下一个或多个的按位或组合
-
REG_EXTENDED:在解释正则表达式时使用 POSIX 扩展正则表达式语法。如果没有设置,则使用 POSIX 基本正则表达式语法。 -
REG_ICASE:不区分大小写。使用此模式缓冲区进行的后续regexec()搜索将不区分大小写。 -
REG_NOSUB:不报告匹配位置。如果提供的模式缓冲区是在设置了此标志的情况下编译的,则忽略regexec()的 nmatch 和 pmatch 参数。 -
REG_NEWLINE:匹配任意字符运算符不匹配换行符。- 不包含换行符的非匹配列表(
[^...])不匹配换行符。 - 行首匹配运算符(
^)匹配换行符后的空字符串,无论eflags(regexec()的执行标志)是否包含REG_NOTBOL。 - 行尾匹配运算符(
$)匹配换行符前的空字符串,无论eflags是否包含REG_NOTEOL。
- 不包含换行符的非匹配列表(
POSIX 正则表达式匹配
regexec() 用于将空终止的字符串与预编译的模式缓冲区 preg 进行匹配。使用 nmatch 和 pmatch 提供有关任何匹配位置的信息。 eflags 可以是 REG_NOTBOL 和 REG_NOTEOL 的按位或之一,这会改变以下描述的匹配行为
-
REG_NOTBOL:行首匹配运算符始终无法匹配(但请参阅上面的编译标志REG_NEWLINE)。当将字符串的不同部分传递给regexec()且字符串的起始不应被视为行首时,可以使用此标志。 -
REG_NOTEOL:行尾匹配运算符始终无法匹配(但请参阅上面的编译标志REG_NEWLINE)。
字节偏移量
除非为模式缓冲区的编译设置了 REG_NOSUB,否则可以获取匹配地址信息。
pmatch 必须至少有 nmatch 个元素。这些元素由 regexec() 用子串匹配地址填充。从第 i 个开括号开始的子表达式的偏移量存储在 pmatch[i] 中。
整个正则表达式的匹配地址存储在 pmatch[0] 中。(注意,为了返回子表达式匹配的偏移量,nmatch 必须至少为 N + 1。)
未使用的结构元素将包含值 -1。
regmatch_t 结构,它是 pmatch 的类型,定义如下:
pub struct regmatch_t {
pub rm_so: regoff_t,
pub rm_eo: regoff_t,
}
每个不是 -1 的 rm_so 元素指示字符串中下一个最大子字符串匹配的起始偏移量。
相对的 rm_eo 元素指示匹配的结束偏移量,即匹配文本后的第一个字符的偏移量。
POSIX 错误报告
regerror() 用于将 regcomp() 和 regexec() 可以返回的错误代码转换为错误信息字符串。
regerror() 接收错误代码,errcode,模式缓冲区,preg,一个指向字符字符串缓冲区的指针,errbuf,以及字符串缓冲区的大小,errbuf_size。
它返回包含空终止错误信息字符串所需的 errbuf 的大小。如果 errbuf 和 errbuf_size 都是非零的,则 errbuf 用错误信息的第一个 errbuf_size - 1 个字符填充,并以终止空字节 (\0) 结尾。
POSIX 模式缓冲区释放
使用预编译的模式缓冲区,preg 传递 regfree() 将释放编译过程为模式缓冲区分配的内存。
返回值和错误
regcomp() 在成功编译时返回零。在失败时,它返回以下错误之一(请参阅 reg_errcode_t)
REG_BADBR:不正确使用反向引用运算符。REG_BADPAT:不正确使用模式运算符,例如分组或列表。REG_BADRPT:不正确使用重复运算符,例如将*用作第一个字符。REG_EBRACE:不匹配大括号区间运算符。REG_EBRACK:不匹配括号列表运算符。REG_ECOLLATE:无效的排序元素。REG_ECTYPE:未知字符类名称。REG_EEND:非特定错误。这不是由 POSIX.2 定义的。REG_EESCAPE:尾随反斜杠。REG_EPAREN:不匹配括号组运算符。REG_ERANGE:范围运算符使用无效;例如,范围的结束点发生在起始点之前。REG_ESIZE:编译正则表达式需要大于64Kb的模式缓冲区。这不是由POSIX.2定义的。REG_ESPACE:正则表达式例程耗尽内存。REG_ESUBREG:对子表达式的无效后向引用。
regexec()在成功匹配时返回零,或者在失败时返回REG_NOMATCH。
线程安全性
regcomp()和regexec()仅在调用过程中不修改进程区域设置时是线程安全的。regerror()仅在调用过程中不修改进程环境时是线程安全的。regfree()是线程安全的。
支持的环境变量
此包依赖于一些环境变量及其变体。对于每个环境变量(例如,CC),以下是其接受的变体
<var>_<target>,例如,CC_x86_64-pc-windows-gnu。<var>_<target-with-underscores>,例如,CC_x86_64_pc_windows_gnu。TARGET_<var>,例如,TARGET_CC。<var>,例如,CC。
以下环境变量(及其变体)影响此包的构建方式
GNURX_LIB_DIR_PREFIXCCCFLAGSARARFLAGS
链接选项
默认情况下,此包从源代码构建libgnurx并将其静态链接到它。
为了更改此行为,并指导此包动态链接到外部构建的libgnurx-0.dll库,请在构建时定义环境变量GNURX_LIB_DIR_PREFIX(或其任何变体)。GNURX_LIB_DIR_PREFIX的值需要是库安装的绝对前缀路径。预期libgnurx头文件位于<GNURX_LIB_DIR_PREFIX>/include/,共享库应位于<GNURX_LIB_DIR_PREFIX>/bin/。
依赖此包
此包为其他依赖于它的包提供以下变量
DEP_GNURX_INCLUDE:库C头文件所在的目录路径。DEP_GNURX_LIB:库二进制文件所在的目录路径。
特定平台说明
此包只支持以下目标平台
x86_64-pc-windows-gnu.i686-pc-windows-gnu.
这是由于libgnurx库的性质。
版本控制
本项目遵循语义化版本控制。时间推移中显著的变更细节请查看CHANGELOG.md文件。
许可证
版权所有 (c) 2020-2023 Koutheir Attouchi。
请参阅此发行版顶层目录中的LICENSE.txt文件。
根据LGPL版本2.1许可证,或其任何更新版本授权。除非按照这些条款,否则不得复制、修改或分发此文件。
依赖
约0-2.8MB
约44K SLoC