我在c#中使用以下正则表达式来匹配某些输入情况:
^
(?<entry>[#])?
(?(entry)(?<id>\w+))
(?<value>.*)
$
这些选项将忽略模式空白。
我的输入如下:
hello
#world
[xxx]
可以在这里测试所有这些:DEMO
我的问题是此正则表达式与最后一行不匹配。为什么?
我想做的是检查输入字符。如果有,我用\w+
强制输入一个标识符。其余输入应在最后一组中捕获。
这是一个简单的正则表达式和简单的输入。
如果我将id regex更改为(?(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正则表达式中的错误,并将其报告给了Microsoft:See here for more information
答案 0 :(得分:0)
在正则表达式解析器中没有错误,但是在使用.
通配符说明符时没有错误。 .
说明符将占用所有字符,等待它,除了换行符\n
之外。 (请参见Character Classes in Regular Expressions“任意字符” .
])
如果您想让正则表达式正常工作,则需要使用所有字符,包括换行符 ,这可以通过指定选项SingleLine来完成。用什么来解释怎么说
Singline告诉解析器处理.
以匹配包括\n
在内的所有字符。
为什么在非单行模式下消耗其他行时为什么仍然失败?这是因为最终匹配实际上将当前位置放在\n
上,唯一的选项(指定为use)是[。*];正如我们提到的不能使用它,因此停止解析器。此外,$
此时将锁定操作。
让我演示一下我所创建的工具所发生的情况,该工具可以说明问题。在该工具的左上角是示例文本的我们看到的。在此之下,解析器将看到分别由\r\n
表示的↵¶
个字符。该窗格中包括当时匹配项的黄色框内所匹配的项。中间的框是实际的模式,最后一个右侧的框通过侦听返回结构并显示空白来详细显示匹配结果。
请注意,第二个匹配项(作为索引1)在组捕获world
中具有id
,在value
中具有↵
。
我想您的令牌处理器没有在适当的组中得到您想要的东西,并且因为实际上没有将value
的成功匹配视为\r
,因此它被忽略了。
让我们打开Singline看看会发生什么。
现在一切都被消耗掉了,但是存在另一个问题。 :-)