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

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

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

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

我尝试了以下内容

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

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

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

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

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

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

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

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" 

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

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

regexp中的{}具有特殊含义,因此需要对其进行转义。

通常,通过在使用反斜杠转义字符之前进行转义。 在使用方括号定义的字符类中,您不需要这样做

所以像

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

可能更接近你想做的事情

这适用于非嵌套括号,但适用于像

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

[az]*[\{]+([a-zA-Z0-9]+)[\}]+有效。