2017-09-05 74 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