2012-04-13 95 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?如果我对这个答案有点不满,那是因为理解贪婪是掌握正则表达式的第一个重要步骤。 : -/

相关问题