2010-10-23 79 views

回答

4

我會用積極的向前看符號爲每個單詞,像這樣的(你可以根據需要添加儘可能多的):

(?=.*?\bsun\b)(?=.*?\bshining\b).* 
1

您將需要使用正則表達式,認爲這樣的每種排列:

\b(sun\b.+\bshining|shining\b.+\bsun)\b 

這裏所說的邊界\b用於僅匹配字sunshining,並沒有像「晴天」這樣的子詞。

2

基本正則表達式不能很好地處理不同的單詞順序。有辦法做到這一點,但正則表達式變得醜陋,除了正則表達式大師之外對所有人都是難以理解的。我更喜歡在大多數情況下選擇自己的可讀性。

我的建議是使用一個簡單的or變種,是這樣的:

sun.+shining|shining.+sun 

與字邊界如果需要的話:

\bsun\b.+\bshining\b|\bshining\b.+\bsun\b 

由於盧塞羅指出,這將變得笨拙隨着你搜索的單詞數量增加,在這種情況下,我會選擇多個正則表達式匹配解決方案:

def hasAllWords (string, words[]): 
    count = words[].length() 
    for each word in words[]: 
     if not string.match ("\b" + word + "\b"): 
      return false 
    return true 

該僞代碼將對每個單詞執行檢查並確保它們全部出現。

+0

就像Gumbo的解決方案一樣,這會讓更多的單詞變得醜陋,並且由於貪婪的量詞而表現不佳。 – Lucero 2010-10-23 13:56:27

0

你使用兩個正則表達式。

if (($line =~ /\bsun\b.+\bshining\b/) || 
    ($line =~ /\bshining\b.+\bsun\b/)) { 
    # do whatever 
} 

有時你必須做什麼似乎是低科技。這個問題的其他答案會讓你用交替和前瞻等構建複雜的正則表達式,但有時候最好的方法是以最簡單的方式來完成,在這種情況下,就是使用兩種不同的正則表達式。

不用擔心執行速度。除非您將此解決方案與其他更復雜的單表達式解決方案進行對比,否則您不知道哪個更快。編寫緩慢的正則表達式非常容易。