正则表达式分组包括ors的子组并保持捕获计数的不变量

时间:2015-07-03 01:05:31

标签: regex pcre

FWIW我正在使用OCaml绑定到Pcre。

(我将使用类似json的对象来表达我的观点)

我的结构如下:

{"foo":[<valid_regex_pattern>],
 "bar":[<valid_regex_pattern>],
 "baz":[<valid_regex_pattern_1, valid_regex_pattern_2]}

我需要确保每个valid_regex_pattern都表示为一个组,因此我在结构上进行迭代,对于那些只有1个元素的数组,我将它们包装在(?>...)中{ {1}}是...。例如:

<valid_regex_pattern>

对于具有多个模式的数组,我正在“或”它们,然后将它们包装在"(?>googletagmanager\\.com/ns\\.html[^>]+></iframe>)"中,例如:

(?>...)

完成这项工作后,我准备好了我的正则表达式,然后我将它们组合在一起,这样我最终会得到类似的东西

"(?>((<div class=\"[^\"]*parbase)|(<div[^>]+data-component-path=\"[^\"+]jcr:)))"

最后的问题。 Pcre给了我太多的结果,在这个例子中我会期待三个结果,但是PCRE给了我超过3.我认为这是因为我没有正确地对组合数组正则表达式进行分组。我需要结果的数量来匹配初始json结构中的初始数组的数量。

由于没有使用正确的标志,或者分组已关闭,我不确定是否收到了太多的回复。

1 个答案:

答案 0 :(得分:1)

捕获组数量等于括号结构数,未更改存在替换。这就是为什么,如果您通过替换将不同的正则表达式与捕获组相加,那么您将拥有比您更喜欢的组,并且您必须更改正则表达式或修改使用它的程序。

现在,假设您有一个正则表达式(one)来捕获one,另一个正则表达式(other)来捕获other。在各自的使用中,oneother将返回$1(第一个捕获组)。合并它们后,制作(one)|(other),有两个捕获组,$1one$2other,如HERE所示,所以你必须改变程序才能使用2个捕获组或更改正则表达式。

如果您希望oneother只是一个捕获组,则可以执行((?:one)|(?:other))(one|other) https://regex101.com/r/zN7dV4/2之类的操作。添加内容比删除内容更容易,因此我会做((?:one)|(?:other))

所以我尝试了你的代码(除了有一个未转义的/)之外,由于交替,它给了我7个捕获组。我做了同样的事情(组成了一个封闭的小组,让每个小组都没有捕获)并且它得到了3个结果,但是我无法进行测试以确定它们是否符合您的要求。 ((?:(?>((<style>\/\*!\* Bootstrap v(\d\.\d\.\d))|(?:<link[^>]+?href="[^"]+bootstrap(?:\.min)?\.css)|(?:<div [^>]*class="[^"]*col-(?:xs|sm|md|lg)-\d{1,2}) )))|(?:(?><iframe src="[^>]+tumblr\.com)))