Javascript 为什么不是';该组是否捕获括号中显示的所有项目?
我正在尝试创建一个正则表达式,它将捕获第一个组中没有用括号括起来的字符串,然后是用括号括起来的任意数量的字符串 e、 g 2(3)(4)(5) 应该是:2-第一组,3-第二组,依此类推 我想到的是这个正则表达式:(我在使用JavaScript) 然而,当我输入像a(B)(C)(D)这样的字符串时,我只捕获a和DJavascript 为什么不是';该组是否捕获括号中显示的所有项目?,javascript,regex,Javascript,Regex,我正在尝试创建一个正则表达式,它将捕获第一个组中没有用括号括起来的字符串,然后是用括号括起来的任意数量的字符串 e、 g 2(3)(4)(5) 应该是:2-第一组,3-第二组,依此类推 我想到的是这个正则表达式:(我在使用JavaScript) 然而,当我输入像a(B)(C)(D)这样的字符串时,我只捕获a和D 有谁能帮我解决这个问题,并解释一下错误在哪里吗?捕获组的数量不能确定。获取的捕获组数量由正则表达式决定,而不是由它解析的输入决定。在另一个重复中发生的捕获组实际上只保留这些重复中的最后
有谁能帮我解决这个问题,并解释一下错误在哪里吗?捕获组的数量不能确定。获取的捕获组数量由正则表达式决定,而不是由它解析的输入决定。在另一个重复中发生的捕获组实际上只保留这些重复中的最后一个 如果您知道可以遇到的最大重复次数,那么只需重复该模式多次,并使用
?
将每个模式设置为可选。例如,这将捕获括号内最多4个项目:
([^()]*)(?:\(([^)]*)\))?(?:\(([^)]*)\))?(?:\(([^)]*)\))?(?:\(([^)]*)\))?
这不是一个错误。只是在正则表达式中,当您重复一个捕获组
(…)*
时,只有最后一次出现的内容才会放在backreference中
例如:
在字符串“a,b,c,d”上,如果匹配/(,[a-z])+/
,则捕获组1(\1
)的反向引用将给出“d”
如果你想让它返回更多,那么你可以把它放在另一个捕获组中。-->使用
/((?:,[a-z])+)/
则\1
将给出“、b、c、d”
要在括号之间找到这些数字,您也可以尝试匹配单词字符
例如:
var str=“2(3)(14)(B)”;
var matches=str.match(/\w+/g);
console.log(匹配项)代码>由于您不能在JS正则表达式中使用\G
锚(以匹配连续的匹配),并且每个捕获组没有.NET/PyPi正则表达式库中的堆栈,因此需要使用两步方法:1)将字符串作为整条文本进行匹配,然后2)进行后期处理以获得所需的值
var s=“2(3)(4)(5)A(B)(C)(D)”;
变量rx=/[^()\s]+(?:\([^)]*\)*/g;
var res=[],m;
while(m=rx.exec){
res.push(m[0].split(/[()]+/).filter(Boolean));
}
控制台日志(res)不幸的是,我不知道最大的数字。我突然想到,我可以将String.split()与正则表达式一起使用,得到我想要的组。如果您的输入中只有一个这样的模式,那么这确实是可行的,但是如果您有更多这种形式的输入(例如a(B)(C)…D(e)(F)(g)…H(I)
),您将需要更多的处理来确定每个新匹配的开始位置。当然,我是针对你的要求“…应该是:2-第一组,3-第二组…”。你的模式接受A(B)(C)(D)。。。。(Z) 只是?还是随机变化?A(B)C(D)(E)F?
([^()]*)(?:\(([^)]*)\))?(?:\(([^)]*)\))?(?:\(([^)]*)\))?(?:\(([^)]*)\))?