regex如何以非贪婪的方式匹配许多实例中的“ {*各种*字符串*}”?

问题描述

我正在努力提出一些可行的方法

环境:Windows 10(64位)上的Notepad ++ 7.8.7(32位),使用regex101.com进行了一些测试

我有一个游戏配置文件,其中包含很多内容

{ apple
banana
cherry 
}
{ banana
cherry
grape
}
{ cherry
grape
apple
orange
cherry
grape
}
etc.,etc.

我需要匹配个别出现的{ * specific * words * },其中*不包含{}(即,单个括号括起来应该被视为单个匹配,而没有匹配项应包含多个括号)。没有嵌套的括号,这使事情变得更简单。

因此,在上述示例中,我想匹配{ * apple * }{ * apple * cherry * }之类的东西,它们将匹配第一个和第三个方括号,但不匹配第二个。

我已经尝试过类似(?s){.+?apple.+?}之类的数十种变体,但它们要么都不匹配,要么有错误或超时regex101.com(甚至超时),要么太贪婪,忽略了括号之间的界限块。

任何见解都会受到赞赏。

解决方法

您遇到了问题,因为如果要匹配{,则必须用反斜杠将其转义或将其放在方括号中:[{]。另外,除非您添加换行标记,否则.通常不匹配换行符。

我想这就是你想要的:

[^{]*apple[^}]*cherry[^}]*

[^}]*意味着可以根据需要匹配除}以外的任何其他字符。

Demo