代码:
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
答案 0 :(得分:3)
我认为这可能是错误的优化。正如Alternation Constructs in Regular Expressions所指出的那样:
因为正则表达式引擎将表达式解释为锚点(零宽度断言),所以表达式必须是零宽度断言(有关更多信息,请参阅Anchors)或是中包含的子表达式。
您的表达式值不满足这些约束条件。我怀疑某种形式的优化,因为表达式不是零宽度,输入会被提前,直到是可能被满足(因为那是你唯一的模式&#39) ;给了正则表达式引擎使用)
正如评论中所指出的那样,由于表达式也不包含在是中,因此模式永远不会匹配,因此不太可能关于错误优化会引起太多关注。