我可以使用交替链接多少个正则表达式?

rmt*_*eis 11 regex perl

我有一些大文件(数百MB),我需要搜索几千〜20个字符的唯一字符串.

我发现,使用管道交替元字符匹配的正则表达式一样(string1|string2|string3)的速度搜索过程有很多(相对于在同一时间寻找一个字符串).

这种规模有多大的限制是什么?我可以像这样链接多少个表达式?它会在某些时候引起某种溢出吗?有一个更好的方法吗?

编辑

为了使我的问题简短,我没有强调我已经使用这种交替方法实现了代码的事实,我发现它有用:在具有典型数据集的测试用例中,运行时间从87分钟到18秒 - 加速290倍,显然是O(n)而不是O(n*m).

我的问题涉及当其他用户将来使用具有更大文件和更多搜索术语的更大数据集运行此代码时,预期此方法如何工作.原始的O(n*m)代码是已经使用了13年的现有代码,最近指出它的缓慢,因为它最近运行的基因组相关数据集已经变得更大了.

Igo*_*sky 6

如果你有一个简单的正则表达式,如(word1 | word2 | ... | wordn),正则表达式引擎将构造一个状态机,只需将输入传递一次即可查找字符串是否匹配.

旁注:在理论计算机科学中,"正则表达式"的定义方式使得单次传递总是足够的.但是,实际的正则表达式实现添加了允许构造正则表达式模式的功能,这些模式不能总是作为单个传递实现(参见本示例).

同样,对于正则表达式的模式,引擎几乎肯定会使用单个传递.这可能比从内存中多次读取数据要快得多......而且几乎肯定比从磁盘多次读取数据快得多.