我在 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>.*)
$
这就是我尝试使用条件匹配的原因。
更新 10/12/2018
我测试了一下。我发现以下正则表达式应该匹配每个输入,甚至是空输入 - 但它没有:
(?(a)a).*
我认为这是 .net regex 中的一个错误并将其报告给 microsoft:有关更多信息,请参见此处
正则表达式解析器中没有错误,但通配符.说明符的使用中没有错误。说明符.将消耗所有字符,等待它,除了换行符\\n。(请参阅正则表达式中的字符类“任意字符” .])
如果您希望正则表达式正常工作,则需要使用包括换行符在内的所有字符,这可以通过指定选项SingleLine来完成。哪个来解释所说的话
\n\nSingleline 告诉解析器处理.来匹配所有字符,包括\\n.
为什么在不处于单线模式时仍然会失败,因为其他线都被消耗了?这是因为最终的匹配实际上将当前位置放置在 处,\\n并且唯一的选项(指定为 use)是 [.*]; 正如我们提到的,它无法消耗它,因此会停止解析器。此时还将$锁定操作。
让我演示一下我创建的工具所发生的情况,该工具说明了该问题。在该工具中,左上角是我们看到的示例文本。下面是解析器看到的分别\\r\\n代表的字符\xe2\x86\xb5\xc2\xb6。该窗格中包含当时在包含匹配项的黄色框中发生匹配的内容。中间的框是实际的模式,最后的右侧框通过监听返回结构并显示如上所述的空白来详细显示匹配结果。
请注意第二个匹配项(如索引 1)具有world组捕获id和valueas \xe2\x86\xb5。
我推测您的令牌处理器没有在适当的组中获得您想要的东西,并且因为人们实际上没有看到 的成功匹配,value所以\\r它被忽略了。
让我们打开 Singline 看看会发生什么。
\n\n\n\n现在一切都被消耗了,但还有一个不同的问题。:-)
\n