2012-04-30 69 views
0

我正在使用Javascript,但我認爲這是一個普通的正則表達式問題。優化特定的正則表達式搜索等距字母

我在寫一個腳本,它在字母之間的距離相等的長字符串中搜索子字符串。例如,在文本a11b22c33d44中,我們有字符串abcd,每兩個連續字母之間的距離爲2。

使用正則表達式搜索找到這樣的字符串是微不足道的:對於上面的示例,我只需要搜索正則表達式/a.{2}b.{2}c.{2}d/。所以我現在做的是這樣的:給一個詞搜索和連續字母之間的距離,我簡單地把它們放在.{n}之間(其中n是距離),把它編譯成正則表達式,讓它完成剩下的工作。

只要字母之間的距離很小 - 例如1000左右,這在實踐中效果很好。之後它變得很慢。它仍然有效,但我希望有另一種方式可以更有效地執行相同的搜索。我沒有看到明顯的原因,爲什麼對於更大的差距,它應該是顯着更慢(我們仍然需要遍歷整個文本只有一次,對吧?)

+0

你舉例regexp'a。{2} b。{2} c。{2} d'也會匹配'aaabbbcccd' - 這是故意的嗎? – hochl

+0

是的,因爲aaabbbcccd仍然包含「abcd」作爲字母間距離爲2的子字符串。 –

回答

1

問題是,點幾乎可以匹配任何東西,包括字母。每當它發現一個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 
+0

謝謝。問題是我不能認爲中間不會有字母(幾乎肯定會有)。 –