C# 正则表达式零量词在.NET和Mono上的行为不同

C# 正则表达式零量词在.NET和Mono上的行为不同,c#,.net,regex,mono,C#,.net,Regex,Mono,我试图用C#中的正则表达式将字符串分成3个不同的部分,左、中、右。 表达式模式是使用输入参数动态构建的,用于设置左量词和右量词。 在大多数情况下,如果量词为一个或更高,它可以正常工作,但是如果将左右量词设置为零,则Windows上的.NET 3.5和Suse上的Mono 2.01.9上的行为会有所不同 例如,使用以下匹配字符串测试字符串“1412”: 在Suse(Mono 2.10.9)上,比赛组包括: left: 141 mid: 2 right: 如果我将模式中的左量词和右量词更

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

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

在Suse(Mono 2.10.9)上,比赛组包括:

left:   141
mid:    2
right:
如果我将模式中的左量词和右量词更改为非贪婪,则在两个平台上得到相同(预期)的结果:

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

left:
mid:    1412
right:
^(?{0}?(.+)(?。{0}?)
左:
年中:1412
正确的:

虽然这似乎解决了问题,但这段代码对我们的应用程序至关重要,因此我想了解为什么行为与原始模式不同。

正则表达式中有懒惰和贪婪的量词,根据(取自)

在“尝试”和“尝试”之间做出决定的情况下 “跳过一次尝试”,就像由量词控制的项目一样,引擎 总是选择首先尝试贪婪的量词,并且 首先跳过对懒惰(非贪婪)的尝试


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

-
中的
-^(?{0})(?.+)(?.{0})
输入错误?是的,模式应该是
^(?{0})(?.+)(?.{0})
示例编辑如果使用
{0,0},会发生什么
?结果与使用贪婪的{0}相同。NET的行为与预期一样,但Mono将最后一个字符放在mid.
^(?{0,0})(?+)(?{0,0})left:141 mid:2 right:
FWIW,我相信Mono 4.0使用Microsoft的.NET正则表达式实现,所以它们的行为应该完全相同。
left:   141
mid:    2
right:
^(?<left>.{0}?)(?<mid>.+)(?<right>.{0}?)

left:
mid:    1412
right: