2015-09-28 59 views
3

我有一個由\n分隔的單詞的長按字母順序排列的列表以及一組諸如'c'和'f'之類的字符。我想找到這兩個字母不同的單詞,如「can」,「fan」,「came」,「fame」,「rice」和「rife」。正則表達式找出相差一個字母的單詞

此正則表達式查找我一些對的話,在很短的列表,你可以see here

/\n(.*?)c(.*?)\n(.*?\n)*?\1f\2\n/g 

然而,這並不表明我與它找到第一個匹配項重疊的任何比賽,並當我在長列表上使用它時,堆棧空間耗盡。

我該如何改進這一點,以便我可以在我的單詞列表中找到所有匹配項?

+3

我當然不是世界上最重要的正則表達式專家,但是這讓我覺得這不是一個需要用正則表達式解決的問題。 – CollinD

+1

您可能想要指出您的答案需要什麼正則表達式。 – neontapir

+0

目前我正在Sublime Text中工作,但如果需要的話,我可以使用不同的風味。 –

回答

2

可以使用多個預測。看看這個表達式:

(\b(\w*?)([cf])(\w*)\b)(?=[\s\S]*(\b\2(?!\3)[cf]\4\b)) 

RegEx Demo

正則表達式破碎:

(  # start group #1 
    \b  # word boundary 
    (\w*?) # group #2, capture 0 or more word chars 
    ([cf]) # group #3, capture letters c OR f 
    (\w*) # group #4, capture remaining word chars on RHS of c or f 
    \b  # word boundary 
)   # end group #1 
(?=  # start of lookahead 
    [\s\S]* # match 0 or more of any char including newline 
    (  # start group #5 
    \b # word boundary 
    \2 # back-reference to group #2 
    (?!\3)[cf] # c or f but make sure it is reverse of earlier match using back-reference 
    \4 # back-reference to group #4 
    \b # word boundary 
)  # end of group #5 
)   # end of lookahead 

你的結果是在捕獲組#1,抓獲5#組可用。

+1

這給了我一些假陽性,可能是由於我的單詞列表重複,但它確實爲我需要一個好工作。 –

+0

其實我在前瞻結束時錯過了一個單詞邊界。現在修復它。 – anubhava

相關問題