0

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

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

如您所见,这些字符后面跟着另一个字符,但它们没有必要放在一起。

就像Sublime Text 2 匹配文件名一样。您可以放置​​任何字符,但必须跟随另一个。

例子:

在此处输入图像描述

我必须用 JavaScript 来做。我该怎么做?

如果有人感兴趣,这是我的问题 GitHub 的结果

4

2 回答 2

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");

为了完整起见,这里是一个概念验证小提琴;)

于 2013-09-11T19:41:33.893 回答
1

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

m.*r.*i.*e
于 2013-09-11T19:56:24.320 回答