优化特定正则表达式搜索等距字母

时间:2012-04-30 22:22:58

标签: javascript regex

我正在使用Javascript,但我认为这是一个普遍的正则表达式问题。

我正在编写一个脚本,用于搜索长字符串中的子字符串,字母之间的距离相等。例如,在文本a11b22c33d44中,我们有两个连续字母之间距离为2的字符串abcd

使用regexp搜索找到这样的字符串是微不足道的:对于上面的例子,我只需要搜索regexp /a.{2}b.{2}c.{2}d/。所以我现在正在做的是:给一个搜索单词和连续字母之间的距离我简单地将.{n}放在它们之间(其中n是距离),将其编译为正则表达式并让它执行其余的工作。

这在实践中非常有效,只要字母之间的距离很小 - 例如,大约1000.之后它会变慢。它仍然有效,但我希望有另一种方法可以更有效地执行相同的搜索;我没有看到一个明显的原因,为什么更大的间隙应该明显更慢(我们仍然只需要翻过整个文本一次,对吧?)

1 个答案:

答案 0 :(得分:1)

问题是点几乎可以匹配任何东西,包括字母。每次找到a时,它都必须吞噬下一个 n 字符,并在放弃该匹配之前尝试匹配b。这是浪费了很多精力。

您需要更明确地了解 想要匹配的内容。例如,如果您的搜索字词始终完全由字母组成,则可以通过将.更改为[^a-z]

来加快速度
/a[^a-z]{1000}b[^a-z]{1000}c[^a-z]{1000}d/i

另一种可能性是匹配除下一个必需字符之外的任何内容:

/a[^b]{1000}b[^c]{1000}c[^d]{1000}d/i

两种解决方案均基于所需字符之间的文本不能包含相同字符的假设。

然后,再次,如果您只搜索整个单词,并且您知道搜索词的第一个和最后一个字符将始终是单词字符,那么您可能只需要添加单词边界:

/\ba.{1000}b.{1000}c.{1000}d\b/i