Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么不是';该组是否捕获括号中显示的所有项目?_Javascript_Regex - Fatal编程技术网

Javascript 为什么不是';该组是否捕获括号中显示的所有项目?

Javascript 为什么不是';该组是否捕获括号中显示的所有项目?,javascript,regex,Javascript,Regex,我正在尝试创建一个正则表达式,它将捕获第一个组中没有用括号括起来的字符串,然后是用括号括起来的任意数量的字符串 e、 g 2(3)(4)(5) 应该是:2-第一组,3-第二组,依此类推 我想到的是这个正则表达式:(我在使用JavaScript) 然而,当我输入像a(B)(C)(D)这样的字符串时,我只捕获a和D 有谁能帮我解决这个问题,并解释一下错误在哪里吗?捕获组的数量不能确定。获取的捕获组数量由正则表达式决定,而不是由它解析的输入决定。在另一个重复中发生的捕获组实际上只保留这些重复中的最后

我正在尝试创建一个正则表达式,它将捕获第一个组中没有用括号括起来的字符串,然后是用括号括起来的任意数量的字符串

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)a(B)(C)…D(e)(F)(g)…H(I)
),您将需要更多的处理来确定每个新匹配的开始位置。当然,我是针对你的要求“…应该是:2-第一组,3-第二组…”。你的模式接受A(B)(C)(D)。。。。(Z) 只是?还是随机变化?A(B)C(D)(E)F?
([^()]*)(?:\(([^)]*)\))?(?:\(([^)]*)\))?(?:\(([^)]*)\))?(?:\(([^)]*)\))?