如何匹配给定顺序中包含给定字符的字符串?

时间:2013-09-11 19:38:11

标签: javascript regex

例如,我想匹配my_very_nice_file.js,我想将它与这些字符匹配(mrie):

m: my
r: very
i: nice
e: file

如您所见,这些字符后面跟着另一个字符,但它们不是必需的。

就像Sublime Text 2匹配文件名一样。你可以放任何角色,但必须跟随另一个角色。

示例:

Enter image description here

我必须在JavaScript中完成它。我该怎么办?

如果有人有兴趣,请点击the result of my question GitHub

2 个答案:

答案 0 :(得分:3)

一个简单的模式就是:m.*r.*i.*e.*。但是,我假设您不仅要匹配.js扩展名的文件,而且模式匹配应仅匹配文件名而不是其扩展名。在这种情况下,如果您的扩展名包含任何这些字符,简化模式会导致麻烦。

深思熟虑:以下模式怎么样?

m[a-z0-9\-_]*?r[a-z0-9\-_]*?i[a-z0-9\-_]*?e[a-z0-9\-_]*?\.[a-z]+

模式的简要说明:

  • 确保m,r,i和e的顺序正确
  • 允许每个字符之间包含0个或多个字符(字母数字和下划线)。指某东西的用途 '?'表示一个懒惰的选择:引擎将在继续之前尝试匹配最少数量的字符。

但是,该模式还假设您只想接受字母数字和下划线字符。如果要包含其他字符,可以在方括号之间添加更多符号(但要记住要逃避重要字符)。

要在JS中进行匹配,您可以使用:

var patt = /m[a-z0-9\-_]*?r[a-z0-9\-_]*?i[a-z0-9\-_]*?e[a-z0-9\-_]*?\.[a-z]+/gi;
if(fileName.match(patt)) {
    // If there is a match
} else {
    // If there is no match
}

[编辑] OP询问是否可以加粗突出显示的字符。我建议使用.replace()函数:

var patt = /m([a-z0-9\-_]*?)r([a-z0-9\-_]*?)i([a-z0-9\-_]*?)e([a-z0-9\-_]*\.[a-z]+)/gi;
var newFileName = fileName.replace(patt, "<strong>m</strong>$1<strong>r</strong>$2<strong>i</strong>$3<strong>e</strong>$4");

为了完整起见,这里是proof-of-concept fiddle;)

答案 1 :(得分:1)

我认为这就是你所需要的:

m.*r.*i.*e