Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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 替换中的错误匹配_Javascript_Regex - Fatal编程技术网

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
    后面
  • (?!.\.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”、“/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'
    ,但我怀疑情况是否如此。