Как метод Java в Matcher.group (int) избегает совпадения с содержимым под фигурных скобок в скобках - PullRequest
0 голосов
/ 16 марта 2020

У меня есть строка типа

String str = "美国临时申请No.62004615";

И регулярное выражение типа

String regex = "(((美国|PCT|加拿大){0,1})([\\u4E00-\\u9FA5]{1,8})((NO.|NOS.){1})([\\d]{5,}))";

И другой код

 Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
        System.out.println("1:"+matcher.group(1)+"\n"
                +"2:"+matcher.group(2)+"\n"
                +"3:"+matcher.group(3)+"\n"
                +"4:"+matcher.group(4)+"\n"
                +"5:"+matcher.group(5)+"\n"
                +"6:"+matcher.group(6)+"\n"
                +"7:"+matcher.group(7));
    }

Я знаю, используются круглые скобки () включить группировку регулярных выражений. И группа 1 - большая группа.

Вторая группа ((美国 | PCT | 加拿大) {0,1}) соответствует «美国», «PCT» или «加拿大». Третья группа is ([\ u4E00- \ u9FA5] {1,8}) для соответствия китайскому символу, длина которого составляет от одного до восьми. Четвертая группа ((NO. | NOS.) {1}) соответствует NO , или нет. Пятая группа ([\ d] {5,}) соответствует номеру Но консоль
1:美国临时申请No.62004615 2:美国 3:美国 4:临时申请 5:No. 6:No. 7:62004615

Группа (2) такая же, как группа (3). Группа (5) - это то же самое, что и группа (6)

Кажется, что группа (3) снова сопоставляет вложенные скобки внутри скобок. Интересно, есть ли способ сопоставления только самых внешних скобок? Идеальный результат должен быть
1:美国临时申请No.62004615 2:美国  3:临时申请 4:No. 5:62004615

1 Ответ

2 голосов
/ 16 марта 2020

Звучит так, как будто вы хотите группу без захвата . Из Образец документации :

(?: X ) X , в качестве группы без захвата

Итак, измените это:

(美国|PCT|加拿大)

на следующее:

(?:美国|PCT|加拿大)

… и тогда оно не будет вообще представлено как группа в Matcher.

Некоторые примечания:

  • {0,1} - это то же самое, что и запись ?.
  • {1} ничего не делает и может быть удалена полностью.
  • [\\d] - это то же самое, что и \\d.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...