Javascript 如何使正则表达式只匹配每个匹配的第一个匹配项?

Javascript 如何使正则表达式只匹配每个匹配的第一个匹配项?,javascript,regex,Javascript,Regex,如何修改上面的javascript正则表达式,使其只匹配每个单词的第一次出现(我相信这称为非贪婪) 第一次出现“keyword”和第一次出现“whatever”,我可能会在其中添加更多单词。从正则表达式中删除g修饰符。然后它将只找到一个匹配项。从正则表达式中删除g标志: /\b(keyword|whatever)\b/gi 用一个单一的正则表达式是无法实现的。相反,您必须将希望查找的每个单词存储在一个数组中,在所有单词中循环搜索答案,然后将匹配结果存储在一个数组中 示例: /\b(keywor

如何修改上面的javascript正则表达式,使其只匹配每个单词的第一次出现(我相信这称为非贪婪)


第一次出现“keyword”和第一次出现“whatever”,我可能会在其中添加更多单词。

从正则表达式中删除g修饰符。然后它将只找到一个匹配项。

从正则表达式中删除
g
标志:

/\b(keyword|whatever)\b/gi

用一个单一的正则表达式是无法实现的。相反,您必须将希望查找的每个单词存储在一个数组中,在所有单词中循环搜索答案,然后将匹配结果存储在一个数组中

示例:

/\b(keyword|whatever)\b/i
var words=[“关键字”,“任意”];
var text=“不管怎样,关键字都是这样,不管怎样……不相关,我现在知道了”+
“做一个十来岁的女孩是什么感觉。去吧,爱德华。”;
变量匹配=[];//用于存储结果的空数组。
/*搜索文本时,需要将其转换为小写
可搜索。
*我们将使用内置方法“String.indexOf(pineel)”进行匹配
字符串,因为它避免了对正则表达式的输入进行转义
元字符*/
//文本转换为小写,允许不区分大小写的搜索。
var lowerCaseText=text.toLowerCase();

对于(var i=0;i您所说的不能用JavaScript正则表达式来完成。使用高级正则表达式功能,如.NET的无限制查找,可能是可行的,但JavaScript的功能集非常有限。即使在.NET中,为每个单词创建一个单独的正则表达式并逐个应用它们可能也是最简单的;在JavaScript i这是你唯一的选择

贪婪只适用于使用量词的正则表达式,如
/START.*.END/
表示“任何字符”,而
*
表示“零或更多”。找到
START
后,
*
贪婪地消耗剩余文本。然后开始回溯,“回馈”每次一个字符,直到正则表达式的下一部分,
END
匹配成功。
我们称这个正则表达式为“贪婪”,因为它匹配从第一次出现的
START
到最后一次出现的
END
的所有内容

如果可能有多个“开始”到“结束”序列,并且您希望只匹配第一个字符,您可以将
附加到
*
以使其非贪婪:
/START.*.*END/
。现在,每当
尝试使用下一个字符时,它首先检查是否可以在该位置匹配
END
。因此它从第一个
开始匹配在第一个
END
后面加上START
。如果要单独匹配所有“开始”到“结束”序列,可以添加“g”修饰符:
/START.*?END/g


当然,这比这要复杂一些。例如,如果这些序列可以嵌套,如
START…START…END…END
?如果我对这个答案有点着迷,那是因为理解贪婪是掌握正则表达式的第一个重要步骤。如果你想找到“关键字”和第一次出现的“whatever”可能最好使用2个正则表达式。“贪婪”和“非贪婪”指的是匹配的通配符,如”。"@DavidGorsline这就是我想做的,但可能有不确定的单词数,而不仅仅是两个。我想我的问题不清楚。我实际上希望每个单词都像大卫说的那样出现在括号中。括号中可能有不确定的单词数。好吧,你试图用一个规则的e来实现的目标是不可能的xpression。你必须使用一个正则表达式吗?如果必须的话,我可以使用多个正则表达式,另一个选项是什么?哦,我想我理解你的意思:循环我要匹配的术语,并为每个术语运行相同的正则表达式。我想我会尝试,但我不确定这有多有效。
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
}