当我从条件组中省略“else”时,为什么.NET的正则表达式引擎表现得如此奇怪?

时间:2018-02-02 01:14:09

标签: c# .net regex regex-lookarounds regex-group

代码:

Match match = Regex.Match("abc", "(?(x)bx)");
Console.WriteLine("Success: {0}", match.Success);
Console.WriteLine("Value: \"{0}\"", match.Value);
Console.WriteLine("Index: {0}", match.Index);

输出:

Success: True
Value: ""
Index: 1

似乎没有“else”表达式的条件组将改为从“if”表达式的第一个字符创建一个前瞻,并将其用作“else”。在这种情况下,它将像正则表达式(?(x)bx|(?=b))

一样运行

****在这里发生了什么?这是故意的吗?它似乎没有记录。

编辑:已在corefx存储库中创建了一个问题:https://github.com/dotnet/corefx/issues/26787

1 个答案:

答案 0 :(得分:3)

我认为这可能是错误的优化。正如Alternation Constructs in Regular Expressions所指出的那样:

  

因为正则表达式引擎将表达式解释为锚点(零宽度断言),所以表达式必须是零宽度断言(有关更多信息,请参阅Anchors)或中包含的子表达式。

您的表达式值不满足这些约束条件。我怀疑某种形式的优化,因为表达式不是零宽度,输入会被提前,直到可能被满足(因为那是你唯一的模式&#39) ;给了正则表达式引擎使用)

正如评论中所指出的那样,由于表达式也不包含在中,因此模式永远不会匹配,因此不太可能关于错误优化会引起太多关注。