该项目正在寻找维护者。首先,有一些拉动请求等待审查。
如果您想加紧努力,请通过[email protected]告诉我!
TRE是一个轻巧,健壮且高效的POSIX REGEXP匹配库,具有一些令人兴奋的功能,例如近似(模糊)匹配。
TRE中使用的匹配算法在搜索文本的长度上使用线性最差的时间,以及在使用的正则表达式的长度中使用二次最差的时间。
换句话说,算法的时间复杂性为o(m^2n),其中m是正则表达式的长度,n是文本的长度。二手空间在正则长度上也是二次的,但不取决于搜索的字符串。这种二次行为仅发生在实际上很少见的病理病例上。
这是处理此代码的方法。
您将需要系统上安装的以下工具:
首先,准备树。更改为源目录的根并运行
./utils/autogen.sh
这将使用先决条件工具重新生成各种东西,以便您最终得到可建造的树。
之后,您可以运行配置脚本并照常构建TRE:
./configure
make
make check
make install
在准备好的树中,此命令创建一个源代码tarball:
./configure && make dist
或者,您可以运行
./utils/build-sources.sh
它可以构建源代码软件包并将其放置在dist
子目录中。该脚本需要一个工作的zip
命令。
TRE不仅是另一个RegexP匹配器。 TRE具有一些在大多数免费POSIX兼容实现中不存在的功能。因此,这些功能中的大多数也不存在于非免费实现中。
近似模式匹配允许匹配是近似的,也就是说,在某种程度上,匹配可以接近被搜索的模式。 TRE使用编辑距离度量(也称为Levenshtein距离),其中可以在搜索文本中插入,删除或替换字符以获得确切的匹配。
每个插入,删除或替换都会增加比赛的距离或成本。 TRE可以报告其成本低于某些给定阈值值的比赛。 TRE也可以用于搜索成本最低的比赛。
TRE包括一个以GREP风格的近似Regexp匹配的sunsp(近似GREP)命令行工具的版本。与其他同意实施(例如亚利桑那大学的Sun Wu和Udi Manber的一项)不同,TRE CLESP允许任何长度,任何数量的错误以及插入,删除和替换的非统一费用的全部纠正措施。
POSIX精确地定义了Regexp函数的行为。 TRE试图尽可能严格遵守这些规格。例如,TRE总是返回subpattern的正确匹配项。很少有其他实现正确执行此操作。实际上,除了我知道的(免费或不正确的)之外,唯一的其他实现是汤姆·洛德(Tom Lord),约翰·马多克(John Maddock)的Regex ++以及Glenn Fowler和Doug Mcilroy的AT&T AST Regex。
标准TRE试图符合IEEE STD 1003.1-2001,或开放式基本规格第6期,通常称为“ POSIX”。相关零件是针对正则表达式(和基本原理)的基本规格以及regcomp()
API的描述。
有关POSIX REGEXP匹配器的出色调查,请参见AT&T Labs Research的Glenn Fowler的TestRegex页面。
由于TRE中使用的匹配算法,任何regexec()
调用所消耗的最大时间始终与搜索字符串的长度成正比。有一个例外:如果使用了返回引用,则匹配可能会花费时间呈指数增长,并随着字符串的长度而成倍增长。这是因为匹配的引用是NP的完整问题,几乎可以肯定需要在最坏情况下匹配的指数时间。
regexec()
调用切勿从堆中分配内存。 TRE在regcomp()
调用期间分配了所需的所有内存,以及在regexec()
调用期间,堆栈框架的一些临时工作空间。在匹配过程中,所需的临时空间量是恒定的,并且不取决于搜索的字符串。对于合理尺寸的REGEXP,TRE需要在regcomp()
调用过程中动态分配的内存小于50K,对于编译的模式缓冲区小于20K,在regexec()
调用期间,从堆栈框架中少于2千的临时工作空间。没有时间 /内存权衡。 TRE的代码尺寸也很小;静态链接与TRE相连的可执行文件大小小于30k(GCC-3.2,X86,GNU/Linux)。
TRE支持多重字符集。这使得可以无缝地使用Regexps,例如日本地区。 TRE还提供了广泛的字符API。
TRE提供的API允许在Regexps和搜索字符串中允许二进制零字符。标准API不能轻松地用于搜索二进制数据中的可打印单词(尽管有些黑客攻击是可能的)。使用标准API搜索包含嵌入二进制零的模式。
TRE完全安全。所有导出的功能都是重新输入的,并且可以在多个上下文中同时使用单个编译的Regexp对象。例如,在main()
和信号处理程序中,或在多线程应用程序的许多线程中。
TRE在多个平台上都是便携式的。以下是用于开发和测试TRE的平台和编译器的表:
平台 | 编译器 |
---|---|
FreeBSD 14.1 | 叮当18 |
Ubuntu 22.04 | GCC 11 |
MacOS 14.6 | 叮当声14 |
Windows 11 | Microsoft Visual Studio 2022 |
TRE应该在大多数现代POSIX式平台上进行编译,而无需更改,并可以轻松地用于任何具有托管C实现的平台。
根据平台,您可能需要安装libutf8才能获得广泛的字符和多型字符集支持。
TRE的许可与NetBSD中使用的“ 2条” BSD式许可证基本相同。有关详细信息,请参见文件许可证。
目前有两个功能,两种功能都与整理元素有关,而100%POSIX合规性缺少。这些都是:
支持整理元素(例如[[.<X>.]]
,其中<X>
是整理元素)。由于POSIX并未定义一个方法来确定字符序列是否是多字符整理元素,因此不可能支持多字符整理元素。
支持等价类,例如[[=<X>=]]
,其中<X>
是整理元素。等效类匹配任何具有与<X>
相同的主排列权重的字符。同样,POSIX不提供可移植机制来确定整理元件的主要整理权重。
请注意,其他便携式REGEXP实现也不支持整理元素。单个例外是Regex ++,它带有其自己的数据库,用于整理不同地区的元素。对整理元素和等效类的支持尚未得到广泛要求,目前在待办事项列表中的支持不太高。
这些是我计划尽快实施的其他功能:
GNU正则启用了所有缺失的GNU扩展,例如[[:<:]]
和[[:>:]]
。
REG_SHORTEST
regexec()
标志,用于返回最短匹配,而不是最长的匹配。
与Perl兼容语法:
[:^class:]
除了课堂中的字符外,其他任何东西都匹配。请注意, [^[:class:]]
已经有效,这只是一个便利速记。
A
仅在字符串开始时进行匹配。
Z
仅在字符串的末端或在末尾进行匹配。
z
仅在字符串末端匹配。
l
小写下一个char(思考vi)。
u
Pupercase next char(think vi)。
L
小写直到E
(思考vi)。
U
uppercase直到E
(思考vi)。
(?=pattern)
零宽度的正往外断言。
(?!pattern)
零宽度负相位主张。
(?<=pattern)
零宽度的正面观察主张。
(?<!pattern)
零宽度的负外观主张。
文档尤其是针对TRE的非标准功能(例如近似匹配),这是一项正在进行的工作(“进度”宽松地定义了...),如果您想找到用于使用的扩展名,请阅读include/tre/tre.h
标头如果您对C源代码感到满意,可能会提供一些其他提示。