Javascript 替换中的错误匹配
我想将后缀Javascript 替换中的错误匹配,javascript,regex,Javascript,Regex,我想将后缀.min添加到不在供应商文件夹中的文件中 let str = '/js/index.js'; let str2 = '/vendor/socket-io/library.js'; let myregex = new RegExp('^([^/vendor]*.*[^min]{3}\\.)([a-z]{1,2}s)', 'g'); let myreplace = '$1min.$2'; console.log(str.replace(myregex, myreplace)); conso
.min
添加到不在供应商
文件夹中的文件中
let str = '/js/index.js';
let str2 = '/vendor/socket-io/library.js';
let myregex = new RegExp('^([^/vendor]*.*[^min]{3}\\.)([a-z]{1,2}s)', 'g');
let myreplace = '$1min.$2';
console.log(str.replace(myregex, myreplace));
console.log(str2.replace(myregex, myreplace));
注销
/js/index.min.js
/vendor/socket-io/library.min.js
出于某种原因,它与library.js
匹配,尽管我排除了以下方面的/vendor
:
^([^/vendor]*.* ...
当在上面测试时,所有的代码都被验证了,但是javascript却不这么认为
这是所需匹配的列表:
/vendor/bootstrap/css/bootstrap.min.css --> DO NOT MATCH
/vendor/font-awesome/font-awesome.min.css --> DO NOT MATCH
/vendor/jquery/jquery.min.js --> DO NOT MATCH
/vendor/bootstrap/js/bootstrap.min.js --> DO NOT MATCH
/vendor/socket-io/library.js --> DO NOT MATCH
/js/index.js --> MATCH
/css/style.css --> MATCH
/some/other/script.js --> MATCH
为什么?如果
供应商
文件夹是最上面的文件夹,您可以使用
^(?!\/vendor(?:\/|$))(?!.*\.min\.[^.]*$)(.*\.)
替换为$1分钟。
。看
详细信息
-字符串的开头^
-不能在字符串末尾紧跟在左侧的(?!\/vendor(?:\/|$)
或/vendor/
后面/vendor
-在任何0+个字符之后,尽可能多的字符,在字符串末尾不应该有(?!.\.min\..[^.]*$)
后跟任何字符,而不是.min.
-第1组:除换行符以外的任何0+字符,尽可能多,直到最后一个(.*\)
和
本身
$1min.
插入组1值,并在其后面添加min.
JS演示:
var ss=[“/vendor/bootstrap/css/bootstrap.min.css”、“/vendor/font awesome/font awesome.min.css”、“/vendor/jquery/jquery.min.js”、“/vendor/bootstrap/js/bootstrap.min.js”、“/js/index.min.js”、“/css/style.css”、“/some/other/script.js”];
变量re=/^(?!\/供应商(?:\/^$)(?!.\.min\.[^.]*$)(.\.)/;
用于(ss的var s){
console.log(s,“=>”,s.replace(re,“$1min”);
}
我相信这就是您要找的正则表达式
^(((?!\/vendor)(?!\.min\.).)*?)(\..+)$
此正则表达式的工作原理如下:
供应商
或.min.
后跟任何字符(但必须至少有1个字符)。您可以将
更改为您想要的任何字符。我将其保留为
,因为扩展可以包含许多字符$1.min$3
输入
/vendor/bootstrap/css/bootstrap.min.css
/vendor/font-awesome/font-awesome.min.css
/vendor/jquery/jquery.min.js
/vendor/bootstrap/js/bootstrap.min.js
/vendor/socket-io/library.js
/js/index.js
/css/style.css
/some/other/script.js
/vendor/bootstrap/css/bootstrap.min.css
/vendor/font-awesome/font-awesome.min.css
/vendor/jquery/jquery.min.js
/vendor/bootstrap/js/bootstrap.min.js
/vendor/socket-io/library.js
/js/index.min.js
/css/style.min.css
/some/other/script.min.js
输出
/vendor/bootstrap/css/bootstrap.min.css
/vendor/font-awesome/font-awesome.min.css
/vendor/jquery/jquery.min.js
/vendor/bootstrap/js/bootstrap.min.js
/vendor/socket-io/library.js
/js/index.js
/css/style.css
/some/other/script.js
/vendor/bootstrap/css/bootstrap.min.css
/vendor/font-awesome/font-awesome.min.css
/vendor/jquery/jquery.min.js
/vendor/bootstrap/js/bootstrap.min.js
/vendor/socket-io/library.js
/js/index.min.js
/css/style.min.css
/some/other/script.min.js
[^/vendor]
是不是/
、v
、e
、n
、d
、o
或r
的所有字符的类别。您没有将/vendor
作为字符序列“排除”。模式要求是什么?@WiktorStribiżew编辑的问题是/vendor
始终位于字符串的开头?好的,它正在工作,但仅适用于多行m
。不使用m
而仅使用g
是否可以执行此操作?我只需要使用g
@Moshe:你不需要任何m
。您将获得单独的字符串作为输入。我的演示是一行,里面有换行符,这就是我使用m
修饰符的原因。如果您的输入也是一个多行字符串,就像演示中的一样,您可以使用'gm'
,但我怀疑情况是否如此。