JavaScript正则表达式匹配任何几个术语

时间:2014-07-13 12:52:57

标签: javascript regex

我似乎让很多人对这个问题感到困惑,所以让我尽可能简单地陈述我想做的事情。

我想在文本字符串中搜索以“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");
}

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

此问题已被标记为重复,但另一个问题并未回答我遇到困难的问题。

2 个答案:

答案 0 :(得分:0)

每次执行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);

答案 1 :(得分:0)

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.