我正在学习正则表达式,我有一个疑问。我们考虑一下
var s = "YYYN[1-20]N[]NYY";
现在,我希望在第二次出现时替换/插入[和]之间的'1-8'。 然后输出
YYYN[1-20]N[1-8]NYY
为此,我尝试使用replace
并通过它传递一个函数,如下所示:
var nth = 0;
s = s.replace(/\[([^)]+)\]/g, function(match, i, original) {
nth++;
return (nth === 1) ? "1-8" : match;
});
alert(s); // But It wont work
我认为正则表达式与我正在使用的字符串不匹配。 我该如何解决?
答案 0 :(得分:3)
您的正则表达式\[([^)]+)\]
与空方括号不匹配,因为+
至少需要)
以外的1个字符。我想你想写\[[^\]]*\]
。
以下是您的解决方案的修复方法:
var s = "YYYN[1-20]N[]NYY";
var nth = 0;
s = s.replace(/\[[^\]]*\]/g, function (match, i, original) {
nth++;
return (nth !== 1) ? "[1-8]" : match;
});
alert(s);
以下是另一种方法:
var s = "YYYN[1-20]N[]NYY";
var nth = 0;
s = s.replace(/(.*)\[\]/, "$1[1-8]");
alert(s);
正则表达式(.*)\[\]
尽可能多地匹配并捕获到第1组中的文本(因此我们得到最后一组空[]
),然后匹配空方括号。然后,我们使用[]
反向引用恢复$1
之前的文本,并添加字符串1-8
。
答案 1 :(得分:0)
您可以使用以下正则表达式:
var s = "YYYN[1-20]N[]NYY";
var nth = 0;
s = s.replace(/([^[]+\[(?:[^[]+)\][^[]+)\[[^[]+\](.+)/, "$1[1-8]$2");
alert(s);
第一部分([^[]+\[([^[]+)\][^[]+)
将匹配字符串,其中包含[]
之间的第一个子字符串。并且\[[^[]+\]
将是您想要的第二个,而(.+?)
的最后一个部分与您的字符串的其余部分相匹配。
答案 2 :(得分:0)
如果它只出现两个方括号,那么这将起作用:
/(.*\[.*?\].*\[).*?(\].*)/
此RegEx的“YYYN [1-20] N [”为第一个捕获组,“NYY”为第二个。
答案 3 :(得分:0)
我建议使用简单的split
和join
操作:
var s = "YYYN[1-20]N[]NYY";
var arr = s.split(/\[/)
arr[2] = '1-8' + arr[2]
var r = arr.join('[')
//=> YYYN[1-20]N[1-8]NYY