繁体   English   中英

正则表达式:匹配表达式中最近的开始和结束花括号内的所有内容

[英]Regex: match everything inside closest opening and closing curly braces around expression

这有点难以解释我真正想要的东西(更好的标题建议得到赞赏,以便人们可以在将来轻松找到它)。

假设我有这个:

{
    {
        $myTagThing$
    }
}

我想要匹配

{
    $myTagThing$
} 

即匹配一切从最后{之前$myTagThing$直到第一个}$myTagThing$

所以我认为我需要这个\\{.*\\$myTagThing\\$.*\\} ,但它也会匹配字符串中的第一个{和最后一个} (即整个示例)。 然后我尝试使用前瞻和后视(都是否定的) \\{(.*(?!\\{))\\$myTagThing\\$.*(?<!\\})\\}https://regex101.com/ r / RfdHUH / 1 / )。 但这仍然行不通。

我的理论是,我可能正在使用前瞻和错误的方式,因为这是我第一次使用它们。

有任何想法吗?

编辑:标志是\\gms

注意在问题被更改为不同的情况之前,这被投了3次,并被标记为此问题的修订版2的已接受答案,并且此答案未被接受。

你需要寻找:打开大括号,然后是一系列不是打开或接近大括号的字符,然后是close-curly-brace。

具体来说: {[^{}]*}

编辑: 这解决了不再包含在问题中的{ $myTagThing$ {} }方案。

关于你的更新问题。 在.NET中,您想要的是称为balanced groups 在其他正则表达式引擎中, balanced constructs/expressions 术语略有不同,引擎之间的语法差别很大,行为也是如此。

无论如何,要捕获可能的最大{}内容,您需要:

[^{}]*
(
((?'Open'{)[^{}]*)+
((?'Close-Open'})[^{}]*)+
)*
(?(Open)(?!))

(设置忽略空格标志或折叠此正则表达式)。 这是你答案的核心。 我们在这里用第一行和最后一行修改它:

\{[^{}]*myTagThing
[^{}]*
(
((?'Open'{)[^{}]*)+
((?'Close-Open'})[^{}]*)+
)*
(?(Open)(?!))
[^{}]*\}

正则表达式风暴

“一个正则表达式”解决方案可以快速复杂化,但如果您发现自己经常使用.NET正则表达式,您可能会发现以下值得研究:

在平衡字符内搜索特定文本(递归

上面的链接是我遇到问题的地方,我正在寻找一个字符串,如:

Type VAR.*while{{VAR++}} ,其中while可以跟平衡{} 获得赏金的答案是您想要查看的答案。 这是一个比你更复杂的问题,但你可以看到它变得非常疯狂:

另请参阅有关此功能的官方文档:

https://docs.microsoft.com/en-us/dotnet/standard/base-types/grouping-constructs-in-regular-expressions#balancing_group_definition

另一种方法,修改OP的原始方法:

\{{1}\s*\$myTagThing\$.*?\}

{1}表示只匹配前一个字符一次。 \\s*捕获空白区域。 .*? 使搜索右支撑不贪婪。

当然,如果事物是​​多线的,你也需要启用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM