【问题标题】:Why does .NET's regex engine behave so bizarrely when I omit the "else" from a conditional group?为什么当我从条件组中省略“else”时,.NET 的正则表达式引擎会表现得如此奇怪?
【发布时间】: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


【解决方案1】:

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

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

您的表达式值不满足这些约束。我怀疑某种形式的优化,因为表达式不是零宽度,输入被推进,直到 yes 可能得到满足(因为这是你让正则表达式引擎工作的唯一模式与)

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

【讨论】:

  • 正是我的想法。 (+1)
  • 此错误与您在此处提及的任何内容完全无关。您突出显示了一个句子。这就是说,如果一个非数字的命名捕获组未定义anywhere,它被视为一个前瞻断言,可以部分匹配yes(?(xxx).),或者根本没有。此外,same 行为通过命名捕获(?(t)(?!)[^rt])(?<t>.) 展示。此外,推进比赛位置与此无关。最后,从来没有要求交替,从来没有。这个mis-optimization到底是什么意思??
  • @sln - 通过错误优化,我的意思是他们已经应用了某种形式的优化,假设他们只会在 satisfiable 条件下工作。我同意这是一个错误,但由于情况的不可满足性,这不太可能成为高优先级。
  • but due to the non-satisfiability of the situation, one that's unlikely to be a high priority 我非常怀疑条件交替的混乱(错误)不会是一个高优先级,因为通过条件句检查堆栈的使用率很高 (?(x)( ?!)错字)。 MS 更可能不会改变,因为它只是一家糟糕的公司。还不如说实话。经过 15 年的 MFC,我可以告诉你他们很烂!!
猜你喜欢
  • 2012-09-17
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
相关资源
最近更新 更多