[英]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
可以跟平衡{}
。 获得赏金的答案是您想要查看的答案。 这是一个比你更复杂的问题,但你可以看到它变得非常疯狂:
另请参阅有关此功能的官方文档:
另一种方法,修改OP的原始方法:
\{{1}\s*\$myTagThing\$.*?\}
{1}
表示只匹配前一个字符一次。 \\s*
捕获空白区域。 .*?
使搜索右支撑不贪婪。
当然,如果事物是多线的,你也需要启用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.