Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将shell通配符转换为正则表达式_Javascript_Regex_Wildcard - Fatal编程技术网

Javascript 将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中使用shell通配符搜索标题,如
*.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