如何使用正则表达式替换部分字符串

时间:2017-04-28 08:34:54

标签: javascript regex

我需要在Javascript中替换字符串的一部分

以下示例应阐明我的意思

var str = "asd[595442/A][30327][0]";
var strToReplace = "30333";

var strDesiredResult = "asd[595442/A][30333][0]";

基本上它意味着括号内的第二个区域应该被另一个字符串替换

怎么做?

到目前为止我做的是这样的:

var str = "asd[595442/A][30327][0]";
var regex = /asd\[(.*)\]\[(.*)\]\[(.*)\]/;
var arrMatches = regex.exec(str);

字符串正确显示在arrMatches [2]中,我可以替换它。但是如果在arrMatches [1]中是相同的字符串会发生什么呢?

因为它只应替换第二个括号区域中的值。

4 个答案:

答案 0 :(得分:8)

您可以使用与第一个[....]后跟[匹配的正则表达式,并将该部分捕获到一个组中(您可以通过反向引用引用),然后匹配1除]之外的其他字符替换它们替换它们:

var str = "asd[595442/A][30327][0]";
var strToReplace = "30333";
console.log(str.replace(/(\[[^\]]*]\[)[^\]]*/, "$1" + strToReplace));

var strDesiredResult = "asd[595442/A][30333][0]";
console.log(strDesiredResult);

/(\[[^\]]*]\[)[^\]]*/没有g修饰符,它只会查找一个匹配。

由于正则表达式引擎从左到右搜索字符串中的匹配项,因此您将从左侧获得第一个匹配项。

\[[^\]]*]\[匹配[,然后]以外的任何 0+字符,然后][(...)形成一个捕获组#1,它将记住您可以使用$1反向引用进入替换的值。 <{1}}匹配除[^\]]*以外的0 +字符,这将被替换。

<强>详情:

  • ] - capturing group开头
  • [ - 捕获组#1结束(可以使用替换模式中的) backreference访问其值)
  • $1 - 0+(因为[^\]]*量词匹配零个或多个匹配项,如果您只需匹配有1个或多个匹配项的匹配项,则替换为*+(在JS正则表达式中的一个字符类中,]必须在任何位置进行转义。)

答案 1 :(得分:0)

有很多方法可以做到这一点。一种可能的模式是

str.replace(/^(.+)(\[.+\])(\[.+\])(\[.+\])$/, `$1$2[${strToReplace}]$4`)

您可以看到$<number>被引用来自正则表达式的捕获字符串(括号中的字符串组)。我们可以参考那些并重新排列它,但我们想要。

答案 2 :(得分:0)

您可以使用正则表达式,如下所示/\[[0-9]+\]/

&#13;
&#13;
var str = "asd[595442/A][30327][0]";
var strToReplace = "30333";

var strDesiredResult = str.replace(/\[[0-9]+\]/, '[' + strToReplace + ']'); 

console.log(strDesiredResult);  //"asd[595442/A][30333][0]";
&#13;
&#13;
&#13;

答案 3 :(得分:0)

使用此模式:

'asd[595442/A][30327][0]'.replace(/^(asd\[[^\[\]]+\]\[)([^\[\]]+)(\]\[0\])$/, '$130333$3')

测试here

^            - match beginning of string
first group  - match "asd[", any chars except [ and ], "]["
second group - match any chars except [ and ]
third group  - match exactly: "][0]"
$            - match end of string