我需要选择两个外括号之间的所有文本。由于正则表达式无法保证选择匹配的括号,因此我编写了以下代码:
public static String getContentBetweenCorresponding(String s, char left, char right) {
int pos = s.indexOf(left);
if ( pos > -1 ) {
int start = pos;
int openCount = 0;
while ( pos < s.length() ) {
char currentChar = s.charAt(pos);
if ( currentChar == right ) {
if ( openCount > 1 ) // if openCount == 1 then correct one
openCount--;
else
return s.substring(start + 1, pos);
} else if ( currentChar == left )
openCount++;
pos++;
}
}
return null;
}
它有效。然而它非常慢。我怎样才能加快速度?此方法需要 5 秒来处理手头的字符串,这是我的应用程序的瓶颈。
提前非常感谢!
编辑: 我想做的是将文本放在匹配的括号之间。
getContentBetweenCorresponding("bla{{{blubb}}}}}}", '{', '}')
应该返回
"{{blubb}}"
最佳答案
您编写的方法没有任何明显的低效率。我的猜测是问题实际上在于以下之一:
- 您可能会针对同一个字符串
s
多次调用此函数,而您可以只调用一次并存储结果。 - 您可能会向此方法传递非常大的字符串,并且字符串开头和右大括号之间的距离非常大。
如果您的实际输入预计 {
和 }
之间的距离较大,您可以重写该方法以使用 indexOf
直接查找 left
和 right
,而不是测试每个字符的 charAt
。在这种情况下,对 indexOf
的调用比对 charAt
的调用要少得多,而且最外层大括号之间的字符串中的字符将被检查至少两倍于内部大括号之间的字符。 indexOf
的实现可能会超出 JIT 使用 charAt
执行的性能。
关于java - Java 匹配外括号太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17138820/