0

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

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

使用 regexp 搜索查找此类字符串很简单:对于上面的示例,我只需要搜索 regexp /a.{2}b.{2}c.{2}d/。所以我现在要做的是:给定一个要搜索的单词以及我简单地放在.{n}它们之间的连续字母之间的距离(其中 n 是距离),将其编译为正则表达式并让它完成其余的工作。

只要字母之间的距离很小,这在实践中效果很好——比如说,大约 1000。之后它变得很慢。它仍然有效,但我希望有另一种方法可以更有效地执行相同的搜索;我看不出为什么对于较大的间隙它应该显着变慢的明显原因(我们仍然需要只浏览整个文本一次,对吗?)

4

1 回答 1

1

问题是点几乎可以匹配任何东西,包括字母。每次找到 aa时,它都必须吞噬接下来的n 个字符并尝试匹配 a 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
于 2012-04-30T23:24:50.650 回答