正则表达式分组,包括 ors 的子组并保持捕获计数不变
Regex grouping including subgroups of ors and maintaining invariant of capture count
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 个元素的数组,我将它们包装在 (?>...)
其中 ...
是 <valid_regex_pattern>
。例如:
"(?>googletagmanager\.com/ns\.html[^>]+></iframe>)"
对于不止一种模式的数组,我是"or-ing"他们,然后也用(?>...)
包裹起来,例如:
"(?>((<div class=\"[^\"]*parbase)|(<div[^>]+data-component-path=\"[^\"+]jcr:)))"
完成此操作后,我准备好了我的正则表达式,然后将它们组合起来,这样我最终就会得到类似
的东西
((?>((<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))
终于解决问题了。 Pcre 返回的结果太多,在这个例子中我希望返回三个结果,但是 PCRE 返回的结果超过 3 个。我认为这是因为我没有正确地对组合数组正则表达式进行分组。我需要结果数来匹配初始 json 类结构中初始数组的数量。
我不确定我是否因为没有使用正确的标志而得到太多回复,或者分组已关闭。
捕获组数量等于括号结构计数并且未因交替的存在而改变。这就是为什么,如果您通过交替将不同的正则表达式与捕获组加在一起,您将拥有比您想要的更多的组,并且您必须更改正则表达式或修改使用它的程序。
现在,假设您有一个正则表达式 (one)
来捕获 one
和一个不同的正则表达式 (other)
来捕获 other
。在它们各自的使用中,one
和 other
返回为 </code>(第一个捕获组)。当您组合它们时,使 <code>(one)|(other)
有两个捕获组,</code> 用于 <code>one
和 </code> 用于 <code>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)))
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 个元素的数组,我将它们包装在 (?>...)
其中 ...
是 <valid_regex_pattern>
。例如:
"(?>googletagmanager\.com/ns\.html[^>]+></iframe>)"
对于不止一种模式的数组,我是"or-ing"他们,然后也用(?>...)
包裹起来,例如:
"(?>((<div class=\"[^\"]*parbase)|(<div[^>]+data-component-path=\"[^\"+]jcr:)))"
完成此操作后,我准备好了我的正则表达式,然后将它们组合起来,这样我最终就会得到类似
的东西((?>((<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))
终于解决问题了。 Pcre 返回的结果太多,在这个例子中我希望返回三个结果,但是 PCRE 返回的结果超过 3 个。我认为这是因为我没有正确地对组合数组正则表达式进行分组。我需要结果数来匹配初始 json 类结构中初始数组的数量。
我不确定我是否因为没有使用正确的标志而得到太多回复,或者分组已关闭。
捕获组数量等于括号结构计数并且未因交替的存在而改变。这就是为什么,如果您通过交替将不同的正则表达式与捕获组加在一起,您将拥有比您想要的更多的组,并且您必须更改正则表达式或修改使用它的程序。
现在,假设您有一个正则表达式 (one)
来捕获 one
和一个不同的正则表达式 (other)
来捕获 other
。在它们各自的使用中,one
和 other
返回为 </code>(第一个捕获组)。当您组合它们时,使 <code>(one)|(other)
有两个捕获组,</code> 用于 <code>one
和 </code> 用于 <code>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)))