我试图通过编写一个匹配连续一元自然数列表的正则表达式来更好地理解递归正则表达式。
应匹配的输入字符串:
,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)
,
)+
关于regex - 一元自然数的匹配范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60955596/