regex - 一元自然数的匹配范围

标签 regex

我试图通过编写一个匹配连续一元自然数列表的正则表达式来更好地理解递归正则表达式。

应匹配的输入字符串:

,1,11,111,1111,

111,1111,11111,111111,

我的想法是匹配一个数字,将其放入第 1 组,然后匹配一个逗号并再次匹配第 1 组,添加一个并再次将其放入第 1 组。

我尝试通过前瞻来避免无限递归,但没有成功:

我的尝试(请忽略它与问题规范略有不符):

my $r = qr/
(?:
    (?(?=11)
        ( (?1) 1)
      | (1) 
    )
      ,
)*/x;
'1,11,111' =~ $r;

我使用 Perl 的正则表达式引擎,但我也愿意接受使用其他引擎功能的解决方案。

最佳答案

我很欣赏这个问题,但这并没有按预期工作。虽然理论上都已经说过了。然而,公式“regex cannot count”并不完全适用于许多 regex 引擎。但是,仍然有限制。

在您的示例中,我看到一个起点可变的问题。理想情况下,您希望在任意点开始该模式,即 ^1,11,...^11,111,... 等。不幸的是,我知道如果没有额外的(明确的)改变是不可能的。

坚持原来的方法,我只能使用forward reference在重复组中:

,?(?:
    ( \1? 1) 
    ,
)+

Demo

关于regex - 一元自然数的匹配范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60955596/

相关文章:

javascript - 使用正则表达式验证我们的号码

php - 正则表达式匹配具有特定属性类的 img 标签

javascript - 正则表达式包装的字符串不显示值

php - 在两个字符之间获取

Java 等价于 PHP 的 preg_replace_callback

PHP preg_match 停止代码执行而不会出现错误

regex - 跨多行的复杂匹配

javascript - 正则表达式不能用作 HTML5 模式验证器

c# - 匹配字符串的正则表达式是什么,无论它在任意数量的不同索引处有 1 个或更少的撇号,还是根本没有?

Javascript正则表达式惰性匹配