gpt4 book ai didi

c# - 没有虚假强制匹配的条件匹配?

转载 作者:行者123 更新时间:2023-11-30 12:54:54 26 4
gpt4 key购买 nike

我在 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).*

DEMO

我认为这是 .net 正则表达式中的错误并已将其报告给 Microsoft:See here for more information

最佳答案

正则表达式解析器没有错误,但在使用 . 通配符说明符时没有错误。 . 说明符将消耗所有字符,等待它,换行符 \n 除外。 (参见 Character Classes in Regular Expressions“任意字符”])

如果你想让你的正则表达式工作,你需要消耗所有字符包括换行符,这可以通过指定选项 SingleLine 来完成。 .转述所说的内容

单行告诉解析器处理 . 以匹配所有字符,包括 \n


为什么当不在单行模式时仍然会失败,因为其他行已被消耗?这是因为最终匹配实际上将当前位置放在 \n 并且唯一的选项(指定为 use)是 [.*];正如我们提到的,它不能使用它,因此停止解析器。 $ 也会在此时锁定操作。


让我演示一下我创建的工具发生了什么,该工具说明了这个问题。在该工具中,左上角是我们看到 的示例文本。下面是解析器看到的 \r\n 字符,分别由 ↵¶ 表示。该 Pane 中包含当时在包含匹配项的黄色框中恰好匹配的内容。中间的框是实际的模式,最后的右侧框通过监听返回结构详细显示匹配结果,并如前所述显示空白。

What is matched before singleline

注意第二个匹配项(作为索引 1)在组捕获 idvalue 中有 world 作为 .

我猜测您的 token 处理器没有在正确的组中得到您想要的,因为实际上没有看到 value 的成功匹配作为 \r , 它被忽略了。

让我们打开 Singline,看看会发生什么。

enter image description here

现在一切都被消费了,但是有一个不同的问题。 :-)

关于c# - 没有虚假强制匹配的条件匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52753554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com