更换时错误匹配

时间:2017-09-05 13:28:00

标签: javascript regex

我想将后缀.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

为什么?

2 个答案:

答案 0 :(得分: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."));
}

答案 1 :(得分:1)

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

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

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

  1. 捕获不包含vendor.min.
  2. 的所有字符(但尽可能少)
  3. 捕获.后跟任何字符(但必须至少有1个)您可以将.更改为您想要的任何内容。我将其保留为.,因为扩展程序可以包含许多字符
  4. 使您的替换文字如下:$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