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

xiozqbni  于 2023-08-08  发布在  其他
关注(0)|答案(4)|浏览(117)

我需要在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]中是相同的字符串,会发生什么?
因为它应该只替换第二个括号区域中的值。

jm2pwxwz

jm2pwxwz1#

你可以使用一个正则表达式,它将匹配第一个[....],然后是[,并将该部分捕获到一个组中(你可以通过反向引用来引用),然后匹配除]之外的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修饰符,它只会查找 one 匹配。
由于正则表达式引擎从左到右搜索字符串的匹配项,因此您将从左侧获得第一个匹配项。
\[[^\]]*]\[匹配[,然后匹配 any 0+除]以外的字符,然后匹配][(...)形成了一个捕获组#1,它会记住你可以用$1反向引用替换的值。[^\]]*匹配]以外的0+个字符,这将被替换。

详情

  • (- a capturing group启动
  • \[-文字[符号(如果未转义,则开始character class
  • [^\]]*-匹配零或更多的否定字符类(由于*quantifier
  • ]-文字](在字符类之外,它不必转义)
  • \[-文字[
  • )-捕获组#1的结束(其值可以通过替换模式中的$1backreference访问)
  • [^\]]*- 0+(因为*量词匹配零次或多次出现,如果您只需要匹配出现1次或多次出现的地方,则替换为+)除]之外的字符(在JS正则表达式中的字符类中,]必须在任何位置转义)。
pxy2qtax

pxy2qtax2#

使用此模式:

'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

wmvff8tz

wmvff8tz3#

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

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

字符串
可以看到$<number>引用了从正则表达式捕获的字符串(括号中的字符串组)。我们可以参考这些,并重新安排它,无论我们想要的。

44u64gxh

44u64gxh4#

你可以像下面这样使用正则表达式/\[[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]";

字符串

相关问题