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

Java 用于在{}之间精确提取字符串的正则表达式,java,regex,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*/ }

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

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*/
}
但似乎无法摆脱最后一个

"
}

有什么方法可以提取这个吗?

您可以使用这个正则表达式:

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

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

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

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

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

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

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

@anubhava向您展示了一个专门适合您的示例的聪明(但复杂)正则表达式。但正如@sln所说,正则表达式并不适合平衡元素。这就是为什么开发特定的库来处理XML(广泛使用平衡元素),比如JSoup

因此,即使这不是预期的答案,这里的规则是:甚至不要尝试使用java正则表达式来解析平衡元素::您可以找到(似乎)在某些情况下有效的方法,但在另一种稍有不同的情况下会中断


在这里,您最好构建一个专用的解析器。或者使用中列出的解析器生成器之一。根据该页面,应该是最流行的用于词法分析/解析的Java工具。但是,如果您已经习惯了Lex/Yacc,那么您还可以查看并喜欢这种解析…

@anubhava向您展示了一个专门适用于您的示例的聪明(但复杂)正则表达式。但正如@sln所说,正则表达式并不适合平衡元素。这就是为什么开发特定的库来处理XML(广泛使用平衡元素),比如JSoup

因此,即使这不是预期的答案,这里的规则是:甚至不要尝试使用java正则表达式来解析平衡元素::您可以找到(似乎)在某些情况下有效的方法,但在另一种稍有不同的情况下会中断


在这里,您最好构建一个专用的解析器。或者使用中列出的解析器生成器之一。根据该页面,应该是最流行的用于词法分析/解析的Java工具。但是,如果您已经习惯了Lex/Yacc,那么您还可以查看并喜欢这种解析…

@anubhava向您展示了一个专门适用于您的示例的聪明(但复杂)正则表达式。但正如@sln所说,正则表达式并不适合平衡元素。这就是为什么开发特定的库来处理XML(广泛使用平衡元素),比如JSoup

因此,即使这不是预期的答案,这里的规则是:甚至不要尝试使用java正则表达式来解析平衡元素::您可以找到(似乎)在某些情况下有效的方法,但在另一种稍有不同的情况下会中断


在这里,您最好构建一个专用的解析器。或者使用中列出的解析器生成器之一。根据该页面,应该是最流行的用于词法分析/解析的Java工具。但是,如果您已经习惯了Lex/Yacc,那么您还可以查看并喜欢这种解析…

@anubhava向您展示了一个专门适用于您的示例的聪明(但复杂)正则表达式。但正如@sln所说,正则表达式并不适合平衡元素。这就是为什么开发特定的库来处理XML(广泛使用平衡元素),比如JSoup

因此,即使这不是预期的答案,这里的规则是:甚至不要尝试使用java正则表达式来解析平衡元素::您可以找到(似乎)在某些情况下有效的方法,但在另一种稍有不同的情况下会中断


在这里,您最好构建一个专用的解析器。或者使用中列出的解析器生成器之一。根据该页面,应该是最流行的用于词法分析/解析的Java工具。但是,如果您习惯了Lex/Yacc,那么您还可以查看并喜欢这种解析…

这不起作用。这是不平衡的文本,Java不会这样做。我会让OP在看了演示后决定。在任何情况下,它都不是一个用于匹配平衡括号的通用正则表达式,只是针对OP的问题。如果它不是那么荒谬的错误,它也不会那么糟糕。它匹配
{{{{{{{{{{{{{{{{{{{}}
{{}}}{{{}}}{{{{}}
这不起作用。它不是平衡文本,Java不会这样做。我会让OP在看了演示后决定。在任何情况下,它都不是一个用于匹配平衡括号的通用正则表达式,只是针对OP的问题。如果它不是那么奇怪的错误,那就不会太糟糕了。它匹配
{{{{{{{{{{{{{{}}{{{{{{}{{{{{{{{{{}}}{{{{{{{{{{}}}}}}}}}}}}}}}}}}}}}}}{{{}
这不起作用。它不是平衡文本,Java不会这样做。我会让OP在看了演示后决定。无论如何,它不是一个用于匹配平衡括号的通用正则表达式,只是针对OP的问题。如果它不是那么奇怪的错误,那也不会太糟糕。它匹配
{{{{{{}}
{{}}}{{{{}}}{{{{{}}
这不起作用。它不是平衡文本,Java不会这样做。我会让OP在看了演示后决定。在任何情况下,它都不是一个用于匹配平衡括号的通用正则表达式,只是针对OP的问题。如果不是那么离奇的错误,也不会太糟糕。它匹配
{{{{{{{{{{{{{{{{{{{{{{{{{}}
{{}}}}{{{{}}}}}{{{{{}}}
事实上,Java正则表达式引擎不做平衡文本。因此,使用正则表达式无法解决此问题。如果是dot net、PCRE或Perl引擎,则可以。事实上,Java正则表达式引擎不做平衡文本。因此,使用正则表达式无法解决此问题。如果是dot net、PCRE或Perl引擎,则可以解决此问题。事实上,Java正则表达式引擎无法解决此问题regex引擎不做平衡文本。因此,使用regex无法解决此问题。如果是dot net或PCRE或Perl引擎,则可以。事实上,Java regex引擎不做平衡文本。因此,使用regex无法解决此问题。如果是dot net或PCRE或Perl引擎,则可以。