2011-12-06 22 views
0

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

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.

非常困惑。

+0

文档是对这个很清楚。请参阅:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Matcher.html#groupCount() –

回答

1

以下是否过于务实?

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

(当然,这是假定你要搜索一个真正的RE东西不仅仅是一个支架更为复杂。否则,只需要使用s.replace(")","")

+0

实际上,这是我见过的最优雅的东西 – Kidburla

+0

谢谢。但作为一个单元测试,这是一个完全失败:-) – mgaert

+0

这不是一个失败...我试着运行它,它每次都报告成功(而不是失败)! ;-) – Alderath

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); 
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", ")"); //为 ')'

int totalCount = count1+count2; 

StringUtils存在于common-lang库。

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 
) 
相关问题