You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:07:18