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结构中的初始数组的数量。
由于没有使用正确的标志,或者分组已关闭,我不确定是否收到了太多的回复。
答案 0 :(得分:1)
捕获组数量等于括号结构数,未更改存在替换。这就是为什么,如果您通过替换将不同的正则表达式与捕获组相加,那么您将拥有比您更喜欢的组,并且您必须更改正则表达式或修改使用它的程序。
现在,假设您有一个正则表达式(one)
来捕获one
,另一个正则表达式(other)
来捕获other
。在各自的使用中,one
和other
将返回$1
(第一个捕获组)。合并它们后,制作(one)|(other)
,有两个捕获组,$1
为one
,$2
为other
,如HERE所示,所以你必须改变程序才能使用2个捕获组或更改正则表达式。
如果您希望one
和other
只是一个捕获组,则可以执行((?: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)))