我因重复限定符而无法构建正则表达式。没有运气在网上找到一条建议。
这是一个匹配的字符串 -
abc cde fgi
正则表达式是
^(?:(.*?)(abc|fgi)){2}(.*)$
以下是redemo.py的示例输出:
我从Perl得到的类似输出:
perl --version | head -2; perl -MData::Dumper -e 'print Dumper ["abc cde fgi" =~ /^(?:(.*?)(abc|fgi)){2}(.*)$/g]'
This is perl 5, version 14, subversion 4 (v5.14.4) built for cygwin-thread-multi
$VAR1 = [
' cde ',
'fgi',
''
];
我最好留下范围的原因,为什么我必须正确应用这个正则表达式。
但问题是:我希望'{2}'限定符是一个严格的要求来匹配字符串,因此解释器将返回5组成功匹配 -
1: ''
2: 'abc'
3: ' '
4: 'fgi'
5: ''
出乎意料的是,解释器只返回3组很好,看起来“{2}”限定符被忽略了。
如果我对正则表达式重复限定词的理解错误,有人会发表评论吗?
任何人都可以建议一个工具来逐步解释正则表达式的解释吗?
谢谢,
答案 0 :(得分:1)
您的正则表达式中包含{2}
,但尚未将其包含在匹配组中。这意味着在计算是否存在匹配时评估重复条件,但在计算导致匹配的组时不评估重复条件。相反,你得到匹配两次的组的一次重复。要将重复分配给一个组的内容,请在{2}
中为该组添加()
。
请注意,从不获得的分组数量多于输入中的文字()
对。要获得组的单独重复,您必须编写循环并重复匹配(或者在Perl中,通过其e
标志在正则表达式中包含代码)。