如何计算Java正则表达式中字符串中括号的数量

时间:2011-12-06 08:37:50

标签: java regex

所以我试图通过使用正则表达式来计算字符串中括号的数量(例如小括号)。我在matcher类上找到了这个方法“groupCount”。所以我认为这可以帮助我。

groupCount在JavaDoc中说“任何小于或等于此方法返回的值的非负整数都保证是此匹配器的有效组索引。”所以我想象一下这句话

m.group(m.groupCount());

应始终有效。错...

这是我写的一些测试代码:

public class TestJavaBracketPattern {

    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\))").matcher(")");
        System.out.println(m.group(m.groupCount()));
    }

}

现在,我希望在正则表达式中匹配一个紧密括号(称为\)并获得单个匹配。正则表达式是(\)) - 这应该与包含闭括号符号的组匹配。但它只是抛出一些异常(java.lang.IllegalStateException:找不到匹配项。)

接下来,我尝试匹配没有匹配的地方:

public class TestJavaBracketPattern {

    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\))").matcher("(");
        System.out.println(m.group(m.groupCount()));
    }

}

我得到了同样的例外。事实上,在这两种情况下我都发现groupCount方法返回1。

很困惑。

4 个答案:

答案 0 :(得分:1)

groupCount返回模式中的组数,而不是匹配的结果。

你必须做这样的事情;

Matcher m = Pattern.compile("(\\))").matcher("Hello) how)are)you(");
int count = 0;
while (m.find()) {
    count++;
}
System.err.format("Found %1$s matches\n", count);

答案 1 :(得分:1)

以下是否过于务实?

@Test
void testCountBrackets() {
    String s = "Hello) how)are)you(";
    System.out.println( s.length() - s.replaceAll("\\)", "").length() ); // 3
}

(当然,这假设你想要搜索一个比一个括号更复杂的真实RE。否则只需使用s.replace(")","")

答案 2 :(得分:1)

你没有真正开始搜索,这就是发生异常的原因。

Matcher.groupCount()返回Pattern中的组数,而不是结果。

Matcher.group()返回上一次匹配期间给定组捕获的输入子序列。

您可以参考this page

我改变你的代码,

public class TestJavaBracketPattern {

    public static void main(String[] args) {
       Matcher m = Pattern.compile("(\\))").matcher(")");
       if (m.find()) {           
         System.out.println(m.group(m.groupCount()));
       }
    }
}

添加m.find(),结果为:

1
)

答案 3 :(得分:0)

请使用以下代码。

int count1 = StringUtils.countMatches("fi(n)d ( i)n ( the st)(ri)ng", "("); //代表'('

int count2 = StringUtils.countMatches("fi(n)d ( i)n ( the st)(ri)ng", ")"); // for')'

int totalCount = count1+count2;

StringUtils出现在common-lang库中。