как подсчитать количество скобок в строке в регулярном выражении Java - PullRequest
0 голосов
/ 06 декабря 2011

Поэтому я пытаюсь подсчитать количество скобок (например, закрывающих скобок) в строке с помощью регулярного выражения. Я нашел этот метод "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 ]

1 голос
/ 06 декабря 2011

Вы не начали поиск, это причина возникновения исключения.

Matcher.groupCount () возвращает количество групп в Pattern, а не результат.

Matcher.group () возвращает входную подпоследовательность, захваченную данной группой во время предыдущего совпадения.

Вы можете ссылаться на этой странице .

Я изменил ваш код следующим образом:

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
)
1 голос
/ 06 декабря 2011

Является ли нижеследующее слишком прагматичным?

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

(Конечно, это предполагает, что вы хотите найти в реальном RE нечто более сложное, чем просто скобку. В противном случае просто используйте s.replace(")",""))

1 голос
/ 06 декабря 2011

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 голосов
/ 06 декабря 2011

Пожалуйста, используйте код ниже.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...