花花括号之间的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]+)[\}]+
有效。