Regex(正则表达式),替换javascript中出现的第二个

Regex(正则表达式),替换javascript中出现的第二个,javascript,regex,string,replace,pattern-matching,Javascript,Regex,String,Replace,Pattern Matching,这是正在使用的字符串的示例: xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx] 我在匹配匹配的第二个匹配项时遇到了一些问题,我想返回第二个方括号,里面有一个数字。我有一些正则表达式可以找到第一个带数字的正方形背景: \[+[0-9]+\] 这返回[7],但是我想返回[9] 我使用的是Javascript的替换函数,下面的正则表达式与正则表达式测试应用程序中的第二个匹配(即[9]),但是在Javascript替换函数中没有正确替换: (?:.*?(\[+[0-9]+\]

这是正在使用的字符串的示例:

xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx]
我在匹配匹配的第二个匹配项时遇到了一些问题,我想返回第二个方括号,里面有一个数字。我有一些正则表达式可以找到第一个带数字的正方形背景:

\[+[0-9]+\]
这返回[7],但是我想返回[9]

我使用的是Javascript的替换函数,下面的正则表达式与正则表达式测试应用程序中的第二个匹配(即[9]),但是在Javascript替换函数中没有正确替换:

(?:.*?(\[+[0-9]+\])){2}
我的问题是如何使用上面的正则表达式来替换Javasctipt中的[9],或者是否有另一个正则表达式与方括号中第二个数字匹配


干杯

如果
xxx
只是任意字符串,不一定是数字,那么这可能就是您想要的:

(\[[0-9]+\]\[.*?\])\[([0-9]+)\]
这将在
[]
中查找第二个数字。将其替换为
$1[]

您的正则表达式无法按预期工作,因为后面跟有
+
的组只保留最后一个
[xxx]

Try

result = subject.replace(/(\[\d\]\[[^\]]+\])\[\d\]/, "$1[replace]");
作为注释正则表达式:

(       # capture the following in backref 1:
\[\d\]  # first occurrence of [digit]
\[      # [
 [^\]]+ # any sequence of characters except ]
\]      # ]
)       # end of capturing group
\[\d\]  # match the second occurence of [digit]
如果第一个和第二个
[digit]
组之间的
[xxx]
组数是可变的,则使用

result = subject.replace(/(\[\d\](?:\[[^\]]+\])*?)\[\d\]/, "$1[replace]");
通过使用(非捕获)括号和惰性量词
*?
包围匹配
[xxx]
组的部分,我要求正则表达式引擎尽可能少地匹配这些组,但尽可能多地匹配,以便下一个组是
[digit]

console.log( "xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx]".replace(
/^(.*\[[0-9]+\].*)(\[[0-9]+\])(.*)$/, 
'$1[15]$3')); // replace with matches before ($1) and after ($3) your match ($2)
返回:

// xxxxxx[xxxxxx][7][xxxxxx][15][xxxxxx]

它将匹配[n]前面有一组括号的位置,括号内有数字。

为什么要使用
{3}
作为量词?这似乎不是一种“在我们想要的标签之前总是有三个标签,在我们想要的标签之后总是有一个”的情况,你不应该根据询问者陈述的实际需求来编写正则表达式吗?就我个人而言,我会使用
/(\[\d+\](?:\[..\d..*])*)(\[\d+\])/\1[替换]/
@Anon我们不知道
xxx
不是一个数字。我想是的,但可能我错了。我添加了另一个正则表达式,它将替换第二个
[]
@marcog:询问者提到他想要“第二个匹配”,所以我想我们可以假设
[xxx]
[9]
不匹配。虽然不清楚
[xxx]
是否可以是
[123]
之类的东西,或者它是否必须包含非数字的内容。@您是否同意我的新正则表达式?不确定这是否重要,但在[1][2][3]上失败-替换最后的[3]。也许OP应该提供一些测试。。。