19

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

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

我想获取包括大括号在内的全部记录信息

我试过以下

Pattern logEntry = Pattern.compile("{(.*?)}");
Matcher matchPattern = logEntry.matcher(file);

Pattern.compile("{[^{}]*}");
Matcher matchPattern = logEntry.matcher(file);

我不断收到非法重复错误,请帮助!谢谢。

4

5 回答 5

38

你需要用 '\' 转义 '{' & '}'

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

你必须先用另一个'\'转义'\'

有关需要转义的字符的完整列表,请参见:http ://www.regular-expressions.info/reference.html...

于 2012-09-25T15:28:15.160 回答
9

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

Pattern logEntry = Pattern.compile("\\{(.*?)\\}");

简单测试仪:

 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));
        }

    }

给我:

"time" : "2012-09-24T03:08:50", "message" : "Call() started"
于 2012-09-25T15:27:18.370 回答
6

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

(?<=\{)([^\}]+)(?=\})
  • (?<={) 匹配后跟 { 的所有内容
  • ([^}]+) 匹配任何不包含 } 的字符串
  • (?={) 匹配 { 之前的所有内容
于 2015-04-14T09:02:22.663 回答
0

正则表达式中的 {} 具有特殊含义,因此需要对其进行转义。

通常转义是通过在要转义的字符前面加上反斜杠来实现的。在用方括号定义的字符类中,您不需要这样做

所以像

Pattern.compile("\{[^{}]*\}");

可能更接近你想做的事

于 2012-09-25T15:29:41.317 回答
0

这对于非嵌套括号非常有效,但对于像这样的表达式

(sum(x) * 100) / (sum(y) + sum(z))

[a-z]*[\{]+([a-zA-Z0-9]+)[\}]+作品。

于 2016-03-02T05:51:21.683 回答