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

Its*_*uni 6 .net c# regex

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

假设我有这个:

{
    {
        $myTagThing$
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要匹配

{
    $myTagThing$
} 
Run Code Online (Sandbox Code Playgroud)

即匹配一切从过去{之前$myTagThing$,直到第一个}之后$myTagThing$.

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

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

有任何想法吗?

编辑:标志是\gms.

Ric*_*imo 5

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

您需要查找:open-curly-brace,然后是一系列不是 open 或 close-curly-brace 的字符,然后是 close-curly-brace。

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


zzx*_*xyz 4

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

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

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

[^{}]*
(
((?'Open'{)[^{}]*)+
((?'Close-Open'})[^{}]*)+
)*
(?(Open)(?!))
Run Code Online (Sandbox Code Playgroud)

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

\{[^{}]*myTagThing
[^{}]*
(
((?'Open'{)[^{}]*)+
((?'Close-Open'})[^{}]*)+
)*
(?(Open)(?!))
[^{}]*\}
Run Code Online (Sandbox Code Playgroud)

正则表达式风暴

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

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

上面的链接是我在寻找类似字符串时遇到的问题:

Type VAR.*while{{VAR++}}其中 后面while可以跟着balanced {}。赏金奖励的答案就是您想要查看的答案。这是一个比你的问题更复杂的问题,但你可以看到它很快就会变得疯狂:

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

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