我正在使用Javascript,但我认为这是一个普遍的正则表达式问题。
我正在编写一个脚本,用于搜索长字符串中的子字符串,字母之间的距离相等。例如,在文本a11b22c33d44
中,我们有两个连续字母之间距离为2的字符串abcd
。
使用regexp搜索找到这样的字符串是微不足道的:对于上面的例子,我只需要搜索regexp /a.{2}b.{2}c.{2}d/
。所以我现在正在做的是:给一个搜索单词和连续字母之间的距离我简单地将.{n}
放在它们之间(其中n是距离),将其编译为正则表达式并让它执行其余的工作。
这在实践中非常有效,只要字母之间的距离很小 - 例如,大约1000.之后它会变慢。它仍然有效,但我希望有另一种方法可以更有效地执行相同的搜索;我没有看到一个明显的原因,为什么更大的间隙应该明显更慢(我们仍然只需要翻过整个文本一次,对吧?)
答案 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