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

Ken*_*rey 6 .net c# regex regex-group regex-lookarounds

码:

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);
Run Code Online (Sandbox Code Playgroud)

输出:

Success: True
Value: ""
Index: 1
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dam*_*ver 3

我认为这可能是一个错误的优化。正如正则表达式中的交替构造所指出的:

由于正则表达式引擎将expression解释为锚点(零宽度断言),因此expression必须是零宽度断言(有关详细信息,请参阅Anchors)或也包含在yes中的子表达式。

您的表达值不满足这些限制。我怀疑某种形式的优化,因为表达式不是零宽度,所以输入会被提前,直到可能满足“是” (因为这是您为正则表达式引擎提供的唯一模式)

正如评论中所指出的,由于您的表达式未包含在yes中,因此该模式永远无法匹配,因此不太可能对错误优化产生太多担忧。