【问题标题】:JavaScript regex to match any of several termsJavaScript 正则表达式以匹配多个术语中的任何一个
【发布时间】:2014-07-13 12:52:57
【问题描述】:

我似乎让很多人对这个问题感到困惑,所以让我尽可能简单地说明我想做什么。

我想在一个文本字符串中搜索以“mak”、“mind”和“mass”开头并以任何额外内容或“e”或“er”结尾的单词。那将是“mak”、“make”、“maker”、“mind”、“minde”、“minder”、“mass”、“masse”、“masser”。

如果文本中的某些单词以特定字母开头并以特定字母结尾,我会尝试匹配它们。我正在使用以下正则表达式:

aray = ['mak','mind', 'mass'];
for(i=0; i < aray.length; i++){
    searchTerm = new RegExp(
        "\\b" + aray[i] + "\\b|" +
        "\\b" + aray[i] + "en\\b|" +
        "\\b" + aray[i] + "er\\b");
    word = testText.match(searchTerm, "gi");
}

问题是当第一个实例匹配时,其他实例不会被搜索。有人可以指出我正确的方向。任何帮助将不胜感激。

这个问题已被标记为重复,但另一个问题没有回答我遇到的困难点。

【问题讨论】:

  • 分享一些示例输入。
  • 你应该看到这个主题:stackoverflow.com/questions/15090829/…
  • 你把你的"gi"标志放在了错误的函数上;它应该在 RegExp 构造函数中。除此之外,只要您在循环中使用word inside(在循环外,它始终是最后一场比赛)
  • 我认为“gi”必须在 .match() 中,以便在第一次匹配后继续匹配。我试过把它放在 searchTerm 的最后一行,但这不起作用你到底建议它应该在哪里?我在循环中使用单词
  • 也许 OP 想要的是 myRegex = /\b(word1|word2|word3)(en|er)?\b/gi(请注意,我还使用 JavaScript 的正则表达式文字语法来简化转义和标志)

标签: javascript regex


【解决方案1】:

您每次执行searchTerm = new RegExp(...); 时都在重新创建正则表达式,因此它只会匹配最后一个单词,除非您在循环中使用该表达式,您声称自己是,但它看起来并不喜欢它。我仍然只是猜测你想要什么,但如果你想构造一个匹配所有单词的单个正则表达式,你需要将所有单词放在一个表达式中,并用| 连接。

此外,gi 之类的标志必须传递给 RegExp 构造函数,而不是 match 方法。

var array = ['mak', 'mind', 'mass'];
var searchTerm = new RegExp('\\b(' + array.join('|') + ')(e|er)?\\b', 'gi');
var match = testText.match(searchTerm);

【讨论】:

    【解决方案2】:
    searchTerm = new RegExp("\\b(?:" + aray[i] + ")(?:er|e)?\\b");
    
    正则表达式是:\b(?:mak)(?:er|e)?\b
    它包括:
    \b... 字边界
    两个非捕获组 (?:) ==> 基本上是一个无法在正则表达式中寻址的组。
    第一个非捕获组匹配单词的开头。 (?:mak) ==> mak 是数组条目的占位符。
    第二个非捕获组匹配单词的结尾。 (?:er|e)?
        管道字符是 OR。
        所以这部分匹配 er 或 e。
        必须在 e ==> 之前写 er,如果切换正则表达式引擎将找不到以 er 结尾的单词。
        这 ?在末尾意味着找到零或精确一次,并且也可以在没有(er 或 e)的情况下找到开头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多