Javascript 将shell通配符转换为正则表达式
我想在js中使用shell通配符搜索标题,如Javascript 将shell通配符转换为正则表达式,javascript,regex,wildcard,Javascript,Regex,Wildcard,我想在js中使用shell通配符搜索标题,如*.js,*..*.等。问题是我循环浏览一个标题列表,我需要使用js正则表达式测试过滤文件。如何以一种好的方式将shell通配符转换为regex,或者是否有任何库已经这样做了 注意:我需要一个从shell通配符到regex的通用转换器。这应该非常接近 yourVar.match(/.*\.js$/i) 意义 字符串的开头是任何字符序列* 最后是\.js$ 执行此操作时不区分大小写/i 如果您想要通用转换器功能,这应该可以: function glo
*.js
,*..*.
等。问题是我循环浏览一个标题列表,我需要使用js正则表达式测试过滤文件。如何以一种好的方式将shell通配符转换为regex,或者是否有任何库已经这样做了
注意:我需要一个从shell通配符到regex的通用转换器。这应该非常接近
yourVar.match(/.*\.js$/i)
意义
- 字符串的开头是任何字符序列
*
- 最后是
\.js$
- 执行此操作时不区分大小写
/i
function globStringToRegex(str) {
return new RegExp(preg_quote(str).replace(/\\\*/g, '.*').replace(/\\\?/g, '.'), 'g');
}
function preg_quote (str, delimiter) {
// http://kevin.vanzonneveld.net
// + original by: booeyOH
// + improved by: Ates Goral (http://magnetiq.com)
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Onno Marsman
// + improved by: Brett Zamir (http://brett-zamir.me)
// * example 1: preg_quote("$40");
// * returns 1: '\$40'
// * example 2: preg_quote("*RRRING* Hello?");
// * returns 2: '\*RRRING\* Hello\?'
// * example 3: preg_quote("\\.+*?[^]$(){}=!<>|:");
// * returns 3: '\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:'
return (str + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&');
}
下面是一个JS小提琴的工作:
然后可以使用RegExp对象来匹配:
if (yourString.match(realRegex)) { //do something
更新:支持单个通配符的?
基本上,所有这些都是将整个字符串转换为非正则表达式,然后确保
*
映射到*
,?
映射到
,因为它们是等价的。如果regexp用于获取布尔结果(当您不需要匹配结果时),最好使用测试方法
/.*.js$/i.test(yourVar)
通常*
相当于/.*//code>,而
停留在/.
不,*
是regex中{0,}
的缩写。你应该读得更透彻一些。。。问题是关于搜索中的通配符。例如,*.js
将是/.\.js/
-*
在这里转换为/.*/
。*
采用全局语法(如*.js
)相当于regex中的*
。我认为这是一个误解,它不仅仅是*.js
,而是各种shell通配符。我不会编写\.js$
,因为如果文件扩展名后意外出现空格,它将不匹配。仍然需要替换?
字符。lodash有一个转义符exp如果您已经在使用该库,则可以使用该函数代替preg_quote。
if (yourString.match(realRegex)) { //do something