如何在Javascript中使用正则表达式检查多个匹配词

如何在Javascript中使用正则表达式检查多个匹配词,javascript,regex,Javascript,Regex,嘿,我有这样的代码 var text = "We are downing to earth" var regexes = "earth|art|ear" if (regexes.length) { var reg = new RegExp(regexes, "ig"); console.log(reg) while ((regsult = reg.exec(text)) !== null) { var word = regsult[0]; cons

嘿,我有这样的代码

var text = "We are downing to earth"
var regexes = "earth|art|ear"
if (regexes.length) {
    var reg = new RegExp(regexes, "ig");
    console.log(reg)
    while ((regsult = reg.exec(text)) !== null) {
      var word = regsult[0];
      console.log(word)
    }
  }
我想从文本中获取匹配的单词。它应该有“地球”、“艺术”和“耳朵”。因为“地球”由这些子串组成。相反,它只生产“地球”

我的正则表达式模式有错误吗? 还是应该在JS中使用另一种方法


谢谢

您只能将
earth
作为匹配项,因为正则表达式引擎已将
earth
作为第一个可选项进行匹配,然后在源字符串中继续,而忽略了您也可以匹配
ear
art
的事实。这是所有正则表达式引擎的预期行为-它们不会尝试返回所有可能的匹配,只返回第一个,并且匹配通常不会重叠

是否返回
earth
ear
,取决于正则表达式引擎。POSIX ERE引擎将始终返回最左边、最长的匹配,而大多数当前正则表达式引擎(包括JavaScript)将返回第一个可能的匹配,这取决于正则表达式中的交替顺序

因此,
art | ear
将返回
ear
,而
ear | art | ear
将返回
ear

您可以使用以下命令使正则表达式查找重叠的匹配项(只要它们在字符串中的不同位置开始):

将找到
ear
art
,但不会找到
earth
,因为它与
ear
的起始位置相同。请注意,在本例中,您不能查找正则表达式的完整匹配(
regsult[0]
),而必须查找的内容,在本例中(
regsult[1]

目前我唯一能想到的解决办法就是使用

(?=(ear(th)?|art))

其结果类似于另一个答案中所讨论的那样,单个regexp无法匹配多个重叠的备选方案。在您的情况下,只需对要查找的每个单词进行单独的regexp测试:

var text = "We are downing to earth"
var regexes = ["earth", "art", "ear"];

var results = [];
for (var i = 0; i < regexes.length; i++ ) {
  var word = regexes[i];
  if (text.match(word) results.push(word);
}
如果您的“正则表达式”实际上只是字符串,那么您可以只使用
indexOf
,使事情更简单:

regexes . filter(function(word) { return text.indexOf(word) !== -1; });

是的,应该是这样的,我认为您最初的问题是在JavaScript中找到匹配的单词。如果是这样,您可以将
RegExp
分解为
n
不同的RegExp(其中
n
是字数),然后在句子上运行每个RegExp以了解文本中出现的单词。另外,如果要查找单词的精确匹配,可以使用带有
indexOf
的简单字符串匹配,而不是RegExp。例如fiddle:这当然比试图构造一个广泛嵌套的正则表达式要明智得多。好的,我使用
str.indexOf
来实现这一点。谢谢你的解释:)哦,谢谢,还有一个简洁的解释。但我应该用“str.indexOf”来代替:)
regexes . filter(function(word) { return (text.match(word) || [])[0]; });
regexes . filter(function(word) { return text.indexOf(word) !== -1; });