/\b(keyword|whatever)\b/gi
如何修改上述javascript正則表達式以匹配每個單詞的第一個出現(我相信這被稱爲非貪婪)?如何讓正則表達式匹配每場比賽的第一次出現?
第一次出現「關鍵字」和第一次出現「無論」,我可能會在這裏放更多的單詞。
/\b(keyword|whatever)\b/gi
如何修改上述javascript正則表達式以匹配每個單詞的第一個出現(我相信這被稱爲非貪婪)?如何讓正則表達式匹配每場比賽的第一次出現?
第一次出現「關鍵字」和第一次出現「無論」,我可能會在這裏放更多的單詞。
你在做什麼是簡單地用一個單一的正則表達式無法實現的。相反,您必須將希望查找的每個單詞存儲在數組中,循環搜索所有匹配的答案,然後對於任何匹配,將結果存儲在數組中。
例子:
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
}
刪除正則表達式中的g修飾符。然後它會發現只有一個匹配。從你的正則表達式
刪除g
標誌:
/\b(keyword|whatever)\b/i
什麼你談論的是不能用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
?如果我對這個答案有點不滿,那是因爲理解貪婪是掌握正則表達式的第一個重要步驟。 : -/
如果你想找到第一個出現的「keyword」和第一個出現的「whatever」,你可能最好用2個正則表達式。 「貪婪」和「非貪婪」是指匹配「。」之類的通配符。 – 2012-04-13 15:53:14
@DavidGorsline這就是我想要做的,但可能有不定數量的單詞,而不僅僅是兩個單詞。 – ofko 2012-04-13 16:16:53