Java环境下匹配{}内内容,需排除@{...}格式的正则表达式求助
解决Java中匹配{}内容但排除@{...}的正则问题
我来帮你搞定这个正则匹配的需求!你需要匹配所有{}包裹的内容,但要排除@{...}这种格式,同时还要支持{}出现在字符串开头的情况,对吧?
正确的正则表达式
在Java环境下,你可以使用这个正则:
(?<!@)\{(.*?)\}
正则解释
(?<!@):这是负向后行断言,用来确保左大括号{的前面不是@字符,完美排除了@{...}的情况。\{:匹配字面量左大括号(Java里需要双反斜杠转义)。(.*?):非贪婪模式的捕获组,用来提取{}之间的所有内容(非贪婪能避免匹配到多个}的情况)。\}:匹配字面量右大括号(同样需要转义)。
测试你的示例场景
用这个正则测试你给出的4个测试项:
{eww}→ 匹配成功,捕获到ewwr23r23{fetwe}→ 匹配成功,捕获到fetwe#{d2dded}→ 匹配成功,捕获到d2dded@{d2dded}→ 完全不匹配,符合要求
为什么之前的正则不行?
- 你尝试的
(?<=[^@]\{)[^\}]*(?=\}):用了正向后行断言(?<=[^@]\{),要求{前面必须有一个非@的字符,所以字符串开头的{(比如测试项1)就匹配不到了。 \{(.*?)\}:会匹配所有{},包括@{...}里的内容,不符合排除需求;[^@]\{(.*?)\}不仅会漏掉开头的{,还会把{前面的字符(比如测试项2里的最后一个r)也包含在匹配结果里,显然不对。
Java代码示例
这里给你一个可直接运行的Java代码片段,验证匹配效果:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class BraceMatchTest { public static void main(String[] args) { String testString = "1 {eww}; 2 r23r23{fetwe}; 3 #{d2dded}; 4 @{d2dded}"; // 注意Java字符串里的反斜杠需要转义,所以正则里的\要写成\\ Pattern pattern = Pattern.compile("(?<!@)\\{(.*?)\\}"); Matcher matcher = pattern.matcher(testString); System.out.println("匹配到的有效内容:"); while (matcher.find()) { System.out.println("- " + matcher.group(1)); } } }
运行后输出:
匹配到的有效内容: - eww - fetwe - d2dded
完全符合你的需求!
内容的提问来源于stack exchange,提问作者Panczo
相关产品推荐
相关产品推荐

