替换第二组[和]之间的字符串

时间:2015-07-21 06:38:34

标签: javascript regex

我正在学习正则表达式,我有一个疑问。我们考虑一下

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

我认为正则表达式与我正在使用的字符串不匹配。 我该如何解决?

4 个答案:

答案 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)

我建议使用简单的splitjoin操作:

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