【发布时间】:2019-03-16 03:38:53
【问题描述】:
我在 c# 中使用以下正则表达式来匹配一些输入案例:
^
(?<entry>[#])?
(?(entry)(?<id>\w+))
(?<value>.*)
$
选项忽略模式空格。
我的输入如下:
hello
#world
[xxx]
这一切都可以在这里测试:DEMO
我的问题是这个正则表达式与最后一行不匹配。为什么?
我想要做的是检查输入字符。如果它在那里,我会强制使用\w+ 的标识符。其余输入应在最后一组中捕获。
这是一个简化的正则表达式和简化的输入。
如果我将 id 正则表达式更改为 (?(entry)(?<id>\w+)|)、(?(entry)(?<id>\w+))? 或 (?(entry)(?<id>\w+)?) 之类的内容,则可以解决此问题。
我试图理解为什么条件组与原始正则表达式中所述不匹配。
我对正则表达式很坚定,并且知道可以将正则表达式简化为 ^(\#(?<id>\w+))?(?<value>.*)$ 以满足我的需求。但真正的正则表达式包含另外两个可选组:
^
(?<entry>[#])?
(\?\:)?
(\(\?(?:\w+(?:-\w+)?|-\w+)\))?
(?(entry)(?<id>\w+))
(?<value>.*)
$
这就是我尝试使用条件匹配的原因。
2018 年 10 月 12 日更新
我对它进行了一些测试。我发现以下正则表达式应该匹配每个输入,甚至是一个空的输入 - 但它没有:
(?(a)a).*
我认为这是 .net 正则表达式中的一个错误,并将其报告给微软:See here for more information
【问题讨论】:
-
@WiktorStribiżew 是的,正如我已经说过的,我知道这将解决我的问题。但为什么?有Balancing Group Definitions 在没有那个hack 的情况下工作。
-
我实际上可以在 C# 中重现它。出于某种原因,它匹配
foo,但不匹配[foo]。 -
这是live C# example (演示问题)。
-
@PoulBak 是的,id 组强制
\w+与[不匹配。但仅当entry组有捕获时才应评估该组。该组没有[foo]的捕获,因此不应评估 id 组,整个字符串应由(?<value>.*)组捕获。但它不是那样工作的。 -
对不起,我想我已经接近解决了,让我再深入一点。