Raku中递归正则的使用:如何限制递归层级?
如何限制Raku递归正则
<~~>的递归层级 在处理嵌套内容时,Raku的<~~>递归正则可以匹配任意深度的嵌套,但如果需要限制递归层级(比如仅捕获nestB及以下的内容),直接使用<~~>?/<~~>*等量词无法实现——这些量词仅控制匹配次数,而非递归深度。
解决方案:带参数的自定义递归正则
要实现层级限制,需要通过带参数的自定义递归正则显式跟踪当前嵌套深度,并设置最大允许层级,而非依赖<~~>的默认引用逻辑。
针对场景的示例代码
以你的nest_test.txt为例,若要限制最大递归层级为2(仅匹配nestB及以下的嵌套内容),可以使用如下代码:
raku -ne ' my $max-level = 2; regex nest($current-level = 0) { <-[{}]>* [ \{ <?{ $current-level < $max-level }> <nest($current-level + 1)> \} <-[{}]>* ]* } if m/ \{ <nest> \} / { my $cnt = $/.values[0].grep({ $_ ~~ /\{/ }).elems + 1; put $<nest>, "\t $cnt -levels nested"; } else { put "()\t 0 -levels nested"; } ' nest_test.txt
代码逻辑说明
- 定义带参数的
nest正则,$current-level用于跟踪当前嵌套层级(默认从0开始)。 - 仅当
$current-level小于设定的$max-level时,才允许匹配内部的{...}并递归调用nest($current-level + 1);否则仅匹配非{}的内容,停止递归。 - 通过统计匹配结果中
{的数量,计算实际嵌套层级。
测试结果
运行上述代码后,输出如下:
() 0 -levels nested () 0 -levels nested () 0 -levels nested 「1」 1 -levels nested 「nestA{1}2」 2 -levels nested 「nestB{nestA{1}2」 2 -levels nested
nestC的内容因超过设定的最大层级2,仅匹配到nestB的部分,不会深入到更深层的嵌套,符合需求。
补充说明
之前使用<~~>+量词无效的原因:<~~>是直接引用当前整个正则,<~~>*会尽可能匹配所有嵌套结构,没有层级计数的逻辑,因此无法精准控制递归深度。而带参数的递归正则通过显式跟踪层级,能实现精准的深度限制。
内容的提问来源于stack exchange,提问作者jubilatious1
相关产品推荐
相关产品推荐

