【发布时间】:2018-07-12 11:01:17
【问题描述】:
代码:
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
【问题讨论】:
-
这是一个错误 .. ..
(?=x)bx永远不会匹配,有条件地它永远不会是真的。 -
作为文档,必须有一个
no子句,并且评估表达式必须是yes子句的一部分,但是这里的代码不符合要求,所以你不能做任何可靠的事情.我尝试检查各种条件,但无法正确了解此不符合代码的工作方式。这与 Damien 在答案中提到的相同。 -
但是,同样的问题是,为什么图书馆不因为这个不符合标准的表达式而抛出异常,比如你错过了一个括号左右。
-
这里只是一个补充说明。我不建议让 Dot-Net 引擎决定它是 表达式 条件还是捕获条件。始终是明确的
(?(<named>)或(?(?!expression))。 -
另外,这不仅仅是表达式条件的问题。 named/numbered 组条件也有同样的行为。 (?(1)ab)(.) 而不是正确的行为(预期)(?(1)b|)(.)
标签: c# .net regex regex-lookarounds regex-group