大括号之间的Java正则表达式匹配

Edd*_*e D 14 java regex

我需要解析一个日志文件并获取时间和相关的函数调用字符串它存储在日志文件中,如下所示:{"time":"2012-09-24T03:08:50","message":"Call( )开始"}

其他字符串字符之间会有多个记录时间函数调用,因此我希望使用正则表达式来遍历文件并获取所有这些

我想获取包括大括号在内的整个记录​​信息

我尝试了以下内容

Pattern logEntry = Pattern.compile("{(.*?)}");
Matcher matchPattern = logEntry.matcher(file);
Run Code Online (Sandbox Code Playgroud)

Pattern.compile("{[^{}]*}");
Matcher matchPattern = logEntry.matcher(file);
Run Code Online (Sandbox Code Playgroud)

我一直得到非法重复错误,请帮忙!谢谢.

cko*_*ozl 32

你需要用'\'来逃避'{'&'}'

所以:"{(.*?)}"成为:"\\{(.*?)\\}"

你必须首先用另一个'\'来逃避'\'

请参阅:http://www.regular-expressions.info/reference.html获取需要转义的完整字符列表...


gtg*_*ola 8

Braces 是用于重复组的特殊正则表达式字符,因此您必须将它们转义.

Pattern logEntry = Pattern.compile("\\{(.*?)\\}");
Run Code Online (Sandbox Code Playgroud)

简单测试仪:

 public static void main(String[] args) throws Exception {
        String x =  "{\"time\" : \"2012-09-24T03:08:50\", \"message\" : \"Call() started\"}";
        Pattern logEntry = Pattern.compile("\\{(.*?)\\}");
        Matcher matchPattern = logEntry.matcher(x);

        while(matchPattern.find()) {
            System.out.println(matchPattern.group(1));
        }

    }
Run Code Online (Sandbox Code Playgroud)

给我:

"time" : "2012-09-24T03:08:50", "message" : "Call() started"
Run Code Online (Sandbox Code Playgroud)


gno*_*nom 6

您应该使用积极的前瞻和后视:

(?<=\{)([^\}]+)(?=\})
Run Code Online (Sandbox Code Playgroud)
  • (?<={) 匹配所有后面跟着 {
  • ([^}]+) 匹配任何不包含 } 的字符串
  • (?={) 匹配 { 之前的所有内容