Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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,我正在尝试用regex replace语句修复一个问题。代码如下: var str1 = "bbb/mobile-main.min.js"; var str2 = "ttt/main.min.js"; var str21 = "mobile-main.min.js"; var str22 = "main.min.js"; var re = new RegExp("main\.min\.js" + "(\\?[0-9a-z]+)?", "g"); var ans1 = str1.replac

我正在尝试用regex replace语句修复一个问题。代码如下:

var str1 = "bbb/mobile-main.min.js";
var str2 = "ttt/main.min.js";
var str21 = "mobile-main.min.js";
var str22 = "main.min.js";


var re = new RegExp("main\.min\.js" + "(\\?[0-9a-z]+)?", "g");

var ans1 = str1.replace(re, '$1main.78765.min.js');

var ans2 = str2.replace(re, '$1main.78765.min.js');

var ans21 = str21.replace(re, '$1main.78765.min.js');

var ans22 = str22.replace(re, '$1main.78765.min.js');

console.log("ans1: "+ ans1);

console.log("ans2: "+ ans2);

console.log("ans21: "+ ans21);

console.log("ans22: "+ ans22);
结果是:

   "ans1: bbb/mobile-main.78765.min.js"
   "ans2: ttt/main.78765.min.js"
   "ans21: mobile-main.78765.min.js"
   "ans22: main.78765.min.js"
我想要的结果只是要匹配的第二个字符串(str2):

"bbb/mobile-main.min.js"

"ttt/main.78765.min.js"

"mobile-main.min.js"

"main.78765.min.js"
这里有一个到jsbin的链接

我找不到与我的目标匹配的正则表达式语句。。 谢谢

编辑:Jsbin链接已修复

另一个限制:我不会总是在文件名前面有一些东西。这应该有类似的结果(只有第二个匹配):

Edit2
已编辑的代码+JSBin以及所有条件

您可以使用此正则表达式:

var re = new RegExp("(^|/)main\.min\.js" + "(\\?[0-9a-z]+)?", "g");

var ans1 = str1.replace(re, '$1main.78765.min.js'); // bbb/mobile-main.min.js
var ans2 = str2.replace(re, '$1main.78765.min.js'); // ttt/main.78765.min.js


(^ |/)
确保模式
main\.min\.js
仅在开头或前面有
/

时被替换,为什么第一个字符串不匹配?另外,jsbin链接也不起作用。试着将正则表达式改为
“\/main\.min\.js”+”(\?[0-9a-z]+)?“
,这样它就可以在
main
旁边查找
/
,我不认为需要在js中转义正斜杠(或者这没关系),它应该是:
.replace(new RegExp(“/main\.min\.js”+”(\?[0-9a-z]),“g.),“/main.78765.min.js”);
虽然我不确定这是他问的问题。谢谢,这很接近,但与我需要的正好相反(我需要第二个匹配并替换。另外,我需要这个匹配文件名没有前缀的情况(在我的编辑中提到)。再次感谢!顺便说一句:我希望得到一些解释,我正在努力掌握我的正则表达式技能(:真棒,这正是我想要的。你能更新注释和JSBib(这是正确的解决方案:),仅供将来参考吗(:你的回答对我真的很有帮助。我的最终解决方案有点不同,因为它必须考虑要替换的字符串在较长字符串中的情况。(请参阅)。我唯一不明白的是为什么在“$1main.785…”中使用$1。我看到没有它,第一个字符也会被替换。非常感谢您的帮助!!!我在替换字符串中使用了
$1
,因为我们在这里捕获了此组中的行开始或
/
(^ |/)
因此需要将其放回更换位置。
var re = new RegExp("(^|/)main\.min\.js" + "(\\?[0-9a-z]+)?", "g");

var ans1 = str1.replace(re, '$1main.78765.min.js'); // bbb/mobile-main.min.js
var ans2 = str2.replace(re, '$1main.78765.min.js'); // ttt/main.78765.min.js