JavaScript正则表达式来匹配多个术语中的任意一个

JavaScript正则表达式来匹配多个术语中的任意一个,javascript,regex,Javascript,Regex,我似乎用这个问题把很多人弄糊涂了,所以让我尽可能简单地说明我想做什么 我想在文本字符串中搜索以“mak”、“mind”和“mass”开头,以“e”或“er”结尾的单词。那将是“mak”、“make”、“maker”、“mind”、“minde”、“minder”、“mass”、“masse”、“masser” 我试图匹配文本中的某些单词,如果它们以特定字母开头,以特定字母结尾。我正在使用以下正则表达式: aray = ['mak','mind', 'mass']; for(i=0; i <

我似乎用这个问题把很多人弄糊涂了,所以让我尽可能简单地说明我想做什么

我想在文本字符串中搜索以“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");
}
aray=['mak'、'mind'、'mass';
对于(i=0;i
问题是,当第一个实例匹配时,不会搜索其他实例。有人能给我指一下正确的方向吗。任何帮助都将不胜感激


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

每次执行
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);
正则表达式是:\b(?:mak)(?:er | e)?\b 它包括: \b、 。。。词界 两个非捕获组(?:)==>基本上是一个无法在正则表达式中寻址的组。 第一个非捕获组匹配单词的开头。(?:mak)==>mak是数组项的占位符。 第二个非捕获组匹配单词的结尾。(?:呃| e)? 管道字符是OR。 所以这部分和er或e匹配。 必须在e==>之前写入er,如果切换,正则表达式引擎将找不到以er结尾的单词。
这个“末尾”表示查找零次或精确一次,并允许查找没有(er或e)的开头。共享一些示例输入。您应该看到这个主题:您将
“gi”
标记放在了错误的函数上;它应该在RegExp构造函数中。除此之外,只要在循环内使用
word
(在循环外,无论最后一次匹配是什么),我认为“gi”必须在.match()中,以便在第一次匹配后继续匹配。我试着把它放在searchTerm的最后一行,但那不起作用。你到底建议它应该放在哪里?我在循环中使用word可能OP想要的是
myRegex=/\b(word1 | word2 | word3)(en | er)?\b/gi
(请注意,我还使用JavaScript的regex文本语法来简化转义和标志)
searchTerm = new RegExp("\\b(?:" + aray[i] + ")(?:er|e)?\\b");
The Regex is: \b(?:mak)(?:er|e)?\b It consists of: \b... Word Boundary Two non-capturing groups (?:) ==> Basically a group which cannot be addressed inside the regex. The first non-capturing group matches the beginning of the word. (?:mak) ==> mak is a placeholder for an entry of the array. The second non-capturing group matches the ending of the word. (?:er|e)? The pipe character is an OR. So this part matches er or e. It is necessary to write er before e ==> if switched the regex engine would not find words ending with er. The ? at the end means find zero or exact one times and enables finding the beginning without an (er or e ) too.