我需要在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]中是相同的字符串会发生什么呢?
因为它只应替换第二个括号区域中的值。
答案 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开头
(
- 文字\[
符号(如果未转义,则会启动character class)[
- 匹配零或更多的negated character class(由于[^\]]*
quantifier)*
- 文字]
(在字符类之外,不必转义)]
- 文字\[
[
- 捕获组#1结束(可以使用替换模式中的)
backreference访问其值)$1
- 0+(因为[^\]]*
量词匹配零个或多个匹配项,如果您只需匹配有1个或多个匹配项的匹配项,则替换为*
) +
(在JS正则表达式中的一个字符类中,]
必须在任何位置进行转义。)答案 1 :(得分:0)
有很多方法可以做到这一点。一种可能的模式是
str.replace(/^(.+)(\[.+\])(\[.+\])(\[.+\])$/, `$1$2[${strToReplace}]$4`)
您可以看到$<number>
被引用来自正则表达式的捕获字符串(括号中的字符串组)。我们可以参考那些并重新排列它,但我们想要。
答案 2 :(得分:0)
您可以使用正则表达式,如下所示/\[[0-9]+\]/
。
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;
答案 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