You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java环境下匹配{}内内容,需排除@{...}格式的正则表达式求助

解决Java中匹配{}内容但排除@{...}的正则问题

我来帮你搞定这个正则匹配的需求!你需要匹配所有{}包裹的内容,但要排除@{...}这种格式,同时还要支持{}出现在字符串开头的情况,对吧?

正确的正则表达式

在Java环境下,你可以使用这个正则:

(?<!@)\{(.*?)\}

正则解释

  • (?<!@):这是负向后行断言,用来确保左大括号{的前面不是@字符,完美排除了@{...}的情况。
  • \{:匹配字面量左大括号(Java里需要双反斜杠转义)。
  • (.*?):非贪婪模式的捕获组,用来提取{}之间的所有内容(非贪婪能避免匹配到多个}的情况)。
  • \}:匹配字面量右大括号(同样需要转义)。

测试你的示例场景

用这个正则测试你给出的4个测试项:

  1. {eww} → 匹配成功,捕获到eww
  2. r23r23{fetwe} → 匹配成功,捕获到fetwe
  3. #{d2dded} → 匹配成功,捕获到d2dded
  4. @{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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:53:47