2017-09-05 81 views
1

我想添加后缀.min到我的文件不在vendor文件夹中。错误匹配替换

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]*.* ... 

https://regex101.com/所有检查出来测试,但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 

为什么?

+3

'[^ /供应商]'是**类是_not_'/'中的所有字符的**, v,e,n,d,o或r。 – CBroe

+0

您还没有将'/ vendor'排除为*字符序列*。什么是模式要求? –

+0

@WiktorStribiżew编辑问题 – Moshe

回答

2

如果vendor文件夹是顶级目录,你可以使用

^(?!\/vendor(?:\/|$))(?!.*\.min\.[^.]*$)(.*\.) 

$1min.更换。请参阅regex demo

详细

  • ^ - 字符串的开始
  • (?!\/vendor(?:\/|$)) - 不能有/vendor//vendor随后用绳子结束时立即向左
  • (?!.*\.min\.[^.]*$) - 之后的任何0+尽可能多的字符,应该没有.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", "/vendor/socket-io/library.js", "/js/index.min.js", "/js/index.js", "/css/style.css", "/some/other/script.js"]; 
 
var re = /^(?!\/vendor(?:\/|$))(?!.*\.min\.[^.]*$)(.*\.)/; 
 
for (var s of ss) { 
 
    console.log(s, "=>", s.replace(re, "$1min.")); 
 
}

+0

确定它正在工作,但只有多线'm'。这可以不用'm'完成,只用'g'完成?我只能使用'g' – Moshe

+0

@Moshe:你不需要任何'm'。你得到单独的字符串作为输入。我的演示是一个内部有换行符的单行,这就是我使用'm'修饰符的原因。如果你的输入也是一个多行字符串,就像演示中的那样,你可以使用''gm'',但我怀疑是这样的。 –

1

我相信这是你正在寻找的正则表达式。

^(((?!\/vendor)(?!\.min\.).)*?)(\..+)$ 

这个正则表达式的工作原理如下:

  1. 捕获所有字符(但尽可能少),不包含vendor.min.
  2. 捕获.后跟任意字符(但必须有至少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