正则表达式零量词在.NET和Mono上的表现不同

时间:2015-04-16 11:59:46

标签: c# .net regex mono

我正在尝试在C#中使用正则表达式将字符串分解为最多3个不同的部分,左,中,右。 使用输入参数动态构建表达式模式以设置左和右量词。 在量词为1或更高的大多数情况下,它可以正常工作,但是如果左右量词设置为零,则Windows上的.NET 3.5和Suse上的Mono 2.01.9上的行为会有所不同。

例如,使用以下匹配字符串来测试字符串“1412”:

^(?<left>.{0})(?<mid>.+)(?<right>.{0})

在Windows(.NET 3.5)上,匹配组按预期显示:

left:
mid:   1412
right:

在Suse(Mono 2.10.9)上,匹配组是:

left:   141
mid:    2
right:

解决这个问题,如果我将模式中的左右量词更改为非贪婪,我会在两个平台上得到相同(预期)的结果:

^(?<left>.{0}?)(?<mid>.+)(?<right>.{0}?)

left:
mid:    1412
right:

虽然这似乎解决了这个问题,但这部分代码对我们的应用程序至关重要,所以我想了解为什么原始模式中的行为不同。

1 个答案:

答案 0 :(得分:0)

正则表达式中存在惰性和贪婪量词,并且根据Mastering Regular Expressions(取自here),

  

在决定是在“尝试”和“尝试”之间的情况下   “跳过一次尝试,”与量词,引擎管理的项目一样   总是选择首先尝试贪婪量词,并且   首先跳过懒惰(非贪婪)的尝试。

出于某种原因,Mono regex遵循此路径,.NET Framework通过应用适当的行为来使用正则表达式设置的逻辑。