用于在{}之间精确提取字符串的正则表达式

时间:2015-07-15 21:33:50

标签: java regex

我试图用正则表达式提取一些东西:

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

用于文本块:

{ /*uninterested in this*/ 
"
digraph Checker 
{ 
/*bunch of stuff*/
{
/*bunch of stuff*/
}
{
/*bunch of stuff*/
}
{
/*bunch of stuff*/
}
/*bunch of stuff*/
} //first most curly brace ends, would want the regex to filter out till here, incl. the braces
"
}

并期望输出为:

digraph Checker 
{ 
/*bunch of stuff*/
{
/*bunch of stuff*/
}
{
/*bunch of stuff*/
}
{
/*bunch of stuff*/
}
/*bunch of stuff*/
}

但似乎无法摆脱最后的

"
}

有没有办法可以提取这个?

2 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式:

Pattern logEntry = Pattern.compile("digraph Checker\\s+{((?:[^{]*{[^}]*})*[^}]*)}");

RegEx Demo

答案 1 :(得分:1)

@anubhava向您展示了一个巧妙(但复杂)的正则表达式,专门适用于您的示例。但正如@sln所说,正则表达式并不适合平衡元素。这就是开发特定库来处理XML(大量使用平衡元素)的原因,例如JSoup。

所以,即使这不是预期的答案,这里的规则是甚至不尝试使用java正则表来解析平衡元素:你可以找到(似乎)在某些情况下工作的方法但会打破另一个稍微不同的一个。

你应该做的最好的事情是构建一个专用的解析器。或者使用Yacc equivalent for Java中列出的解析器构建器之一。根据该页面,ANTLR应该是最流行的用于lexing / parsing的Java工具。但是,如果你已经习惯了Lex / Yacc,那么你还要看JFlexBYACC/J这样的解析......