我正在尝试在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:
虽然这似乎解决了这个问题,但这部分代码对我们的应用程序至关重要,所以我想了解为什么原始模式中的行为不同。
答案 0 :(得分:0)
正则表达式中存在惰性和贪婪量词,并且根据Mastering Regular Expressions(取自here),
在决定是在“尝试”和“尝试”之间的情况下 “跳过一次尝试,”与量词,引擎管理的项目一样 总是选择首先尝试贪婪量词,并且 首先跳过懒惰(非贪婪)的尝试。
出于某种原因,Mono regex遵循此路径,.NET Framework通过应用适当的行为来使用正则表达式设置的逻辑。