gpt4 book ai didi

.net - 使用正则表达式查找匹配的括号

转载 作者:行者123 更新时间:2023-12-02 20:56:31 24 4
gpt4 key购买 nike

输入是表示元素列表的字符串。

列表被定义为一个开放的 curl {,后跟 0 个或多个由空格分隔的元素,后跟一个封闭的 curl }

元素可以是文字,也可以是元素列表。

文字是一系列非空白字符。如果元素包含大括号,则必须使用反斜杠对其进行转义:\{\}。 (或者为了简单起见,您可以假设文字中不允许使用花句)

示例:

"{abc { def ghi } 7 { 1 {2} {3 4} } {5 6} x\{yz \}foo }"

文字内没有花句:

"{abc { def ghi } 7 { 1 {2} {3 4} } {5 6} xyz foo }"

(这是 Tcl 列表的简化定义。)

我想知道的是:可以使用正则表达式将输入拆分为最外层循环的元素吗?

预期输出:

abc
{ def ghi }
7
{ 1 {2} {3 4} }
{5 6}
x{yz
}foo

真正的问题是:这可以用正则表达式来完成吗?

我对 .NET 风格最感兴趣,但会接受任何答案。

我将在答案中发布我自己的假设,看看它是否得到验证或被破坏。

最佳答案

不幸的是,对于某些正则表达式的风格来说,答案是肯定的,例如PCRE 和 .NET,因为它们分别支持递归模式和类似堆栈的操作。

语法可以写为

ELEMENT  -> (?!\{)\S+ | LIST
LIST -> '\{\s*' ELEMENT? ('\s+' ELEMENT)* '\s*\}'

因此在 PCRE 中,可以将其转换为模式:

   \{\s*(?0)?(?:\s+(?0))*\s*\}|(?!\{)(?:[^\s}]|\}(?![\s}]))+

# --------------------------- ^^^^^^^^^
# LIST Make sure the } is not closing the group

参见http://www.ideone.com/SnGsU例如(为了简单起见,我删除了顶级 {})。

(当然,不要在工作中尝试这个:))

(顺便说一句,我不知道如何将这个 PCRE 转换为 .NET 风格。如果有人知道,请尝试 Converting PCRE recursive regex pattern to .NET balancing groups definition )

关于.net - 使用正则表达式查找匹配的括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3594325/

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