2012-04-13 94 views
2
/\b(keyword|whatever)\b/gi 

如何修改上述javascript正則表達式以匹配每個單詞的第一個出現(我相信這被稱爲非貪婪)?如何讓正則表達式匹配每場比賽的第一次出現?

第一次出現「關鍵字」和第一次出現「無論」,我可能會在這裏放更多的單詞。

+0

如果你想找到第一個出現的「keyword」和第一個出現的「whatever」,你可能最好用2個正則表達式。 「貪婪」和「非貪婪」是指匹配「。」之類的通配符。 – 2012-04-13 15:53:14

+0

@DavidGorsline這就是我想要做的,但可能有不定數量的單詞,而不僅僅是兩個單詞。 – ofko 2012-04-13 16:16:53

回答

4

你在做什麼是簡單地用一個單一的正則表達式無法實現的。相反,您必須將希望查找的每個單詞存儲在數組中,循環搜索所有匹配的答案,然後對於任何匹配,將結果存儲在數組中。

例子:

var words = ["keyword","whatever"]; 
var text = "Whatever, keywords are like so, whatever... Unrelated, I now know " + 
      "what it's like to be a tweenage girl. Go Edward."; 
var matches = []; // An empty array to store results in. 
/* When you search the text you need to convert it to lower case to make it 
    searchable. 
* We'll be using the built in method 'String.indexOf(needle)' to match 
    the strings as it avoids the need to escape the input for regular expression 
    metacharacters. */ 

//Text converted to lower case to allow case insensitive searchable. 
var lowerCaseText = text.toLowerCase(); 
for (var i=0;i<words.length;i++) { //Loop through the `words` array 
    //indexOf returns -1 if no match is found 
    if (lowerCaseText.indexOf(words[i]) != -1) 
     matches.push(words[i]); //Add to the `matches` array 
} 
+0

我想我的問題並不清楚。正如大衛所說,我實際上希望每個單詞的第一個出現在括號內。括號內可能有無數個單詞。 – ofko 2012-04-13 16:15:47

+0

好的,你試圖實現的是一個正則表達式不可能實現的。你必須使用單個正則表達式嗎? – 2012-04-13 16:18:28

+0

如果需要,我可以使用多個選項,另一種選擇是什麼? – ofko 2012-04-13 16:23:03

3

刪除正則表達式中的g修飾符。然後它會發現只有一個匹配。從你的正則表達式

2

刪除g標誌:

/\b(keyword|whatever)\b/i 
0

什麼你談論的是不能用JavaScript的正則表達式來完成。先進的正則表達式功能(如.NET的無限制後視)可能是可能的,但JavaScript的功能集非常有限。甚至在.NET中,爲每個單詞創建一個單獨的正則表達式並逐一應用它們可能是最簡單的;在JavaScript中它是你唯一的選擇。

貪婪只適用於使用量詞的正則表達式,如/START.*END/.表示「任何字符」,*表示「零個或多個」。在找到START之後,.*貪婪地消耗了文本的其餘部分。然後它開始回溯,一次「回饋」一個字符,直到正則表達式的下一部分,END成功匹配。
我們稱之爲「貪婪」的正則表達式,因爲它匹配從第一次出現START到最後一次出現END的所有內容。

如果有可能不止一個「開始」 - 到 - 「END」序列,並要匹配只是第一個,可以追加一個?*使它非貪婪:/START.*?END/。現在,每當.嘗試消耗下一個字符時,第一個都會檢查該位置是否可以匹配END。因此,它從之後的第一個START到第一個END。如果要分別匹配所有「開始」 - 到「結束」序列,請添加'g'修飾符:/START.*?END/g

當然,這比這更復雜一點。例如,如果這些序列可以嵌套,如START…START…END…END?如果我對這個答案有點不滿,那是因爲理解貪婪是掌握正則表達式的第一個重要步驟。 : -/

相關問題