powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / CaptureCollection и Capture в Java regex
7 сообщений из 7, страница 1 из 1
CaptureCollection и Capture в Java regex
    #38787365
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста, есть ли в Java аналог CaptureCollection из C# ?

В C# есть возможность получить доступ ко ВСЕМ совпадениям для определенного паттерна в group.
Например есть регулярное выражение
Код: c#
1.
\\b(\\w+\\s*)+\\.


и есть строка в которой ищут совпадения "This is a sentence."
Если посмотреть значение в group[1], которым является выражение в круглых скобках
Код: c#
1.
(\\w+\\s*)


то под него попадает сразу 4 слова -
Код: c#
1.
"This", "is", "a", "sentence"

.
(напомню, что group[0] - это по умолчанию все выражение целиком, а group[1] - то что мы определили сами в первых круглых скобках)

Если в C# вызвать значение
Код: c#
1.
 match.Groups[1].Value


то там будет значение "sentence".


Чтобы получить все 4 значения, которые были найдены для выражения

Код: c#
1.
(\\w+\\s*)


надо вызвать

Код: c#
1.
2.
3.
4.
5.
             CaptureCollection captureCollection1 = match.Groups[1].Captures;
             foreach (Capture capture in captureCollection1)
            {
                Console.WriteLine("Capture : " + capture.Value);
            }



В Java я могу тоже получить доступ к группам

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
String line = "This is a sentence.";
        String expression = "\\b(\\w+\\s*)+\\.";

        Pattern pattern = Pattern.compile(expression);
        Matcher m = pattern.matcher(line);

        if(m.find())
        {
            System.out.println("m.group(0): " + m.group(0)); //выводит This is a sentence.
            System.out.println("m.group(1): " + m.group(1));//выводит sentence
        }


То есть на уровне group работает также.
И также group(1) содержит значение последнего найденного соответствия для выражения

Код: java
1.
(\\w+\\s*)

.

Но как получить доступ к предыдущим 3 значениям, которые также были найдены в соответствие шаблону для group(1) -
то есть к "This", "is", "a" ?
...
Рейтинг: 0 / 0
CaptureCollection и Capture в Java regex
    #38787378
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oson,
оно?
...
Рейтинг: 0 / 0
CaptureCollection и Capture в Java regex
    #38787387
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понимаешь, у кого собственно вызывать метод какой-то, чтобы получить доступ ко всем элементам группы?
То есть в C# я делаю вызов

Код: c#
1.
match.Groups[1]



получаю доступ к GroupCollection

Код: c#
1.
GroupCollection пroupCollection1  =  match.Groups[1];



Сам этот match.Groups[1] соответствует моему паттерну в первых круглых скобках.
Был бы паттерн во 2 круглых скобках - я бы получил доступ к этой группе

GroupCollection groupCollection1 = match.Groups[1];

А дальше уже можно работать с groupCollection1, в том числе получить и список всех captures.

А вот в Java когда я делаю

Код: java
1.
matcher.group(1)

, то получаю сразу String

Код: java
1.
String result = matcher.group(1)



и это всегда только последний результат сопадения с регулярным выражением для этой группы.
Что я могу уже вызвать у String? Получается, что к списку всех сопадений, найденных для моего регулярного выражения в первой (второй, третьей...) группе у меня доступа в Java нет - только к последнему его значению.
Видимо в Java хуже дела с regex чем в C#.
...
Рейтинг: 0 / 0
CaptureCollection и Capture в Java regex
    #38787458
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonНо как получить доступ к предыдущим 3 значениям, которые также были найдены в соответствие шаблону для group(1) -
то есть к "This", "is", "a" ?
Код: java
1.
2.
3.
4.
5.
6.
String line = "This. is. a. sentence.";
...
while (m.find()) {
    System.out.println("m.group(0): " + m.group(0)); //выводит This is a sentence.
    System.out.println("m.group(1): " + m.group(1));//выводит sentence
}		
...
Рейтинг: 0 / 0
CaptureCollection и Capture в Java regex
    #38787459
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanosonНо как получить доступ к предыдущим 3 значениям, которые также были найдены в соответствие шаблону для group(1) -
то есть к "This", "is", "a" ?
Код: java
1.
2.
3.
4.
5.
6.
String line = "This. is. a. sentence.";
...
while (m.find()) {
    System.out.println("m.group(0): " + m.group(0)); //выводит This is a sentence.
    System.out.println("m.group(1): " + m.group(1));//выводит sentence
}		

Код: java
1.
String expression = "\\b(\\w+\\s*)+"; // или просто убрать точку (но цикл while остается)
...
Рейтинг: 0 / 0
CaptureCollection и Capture в Java regex
    #38787608
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, я чтото не понял ответ.
Если простосделать цикл по group(1)


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
String line = "This is a sentence.";
        String expression = "\\b(\\w+\\s*)+\\.";

        Pattern pattern = Pattern.compile(expression);
        Matcher m = pattern.matcher(line);

        while(m.find())
        {
            System.out.println("m.group(1): " + m.group(1));//выводит sentence
        }



то выводит только последнюю строку.
Предыдущие недоступны.
...
Рейтинг: 0 / 0
CaptureCollection и Capture в Java regex
    #38787619
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonвыводит только последнюю строку.
Предыдущие недоступны.И правильно, т.к. точка стоит сразу же за последним словом. Условие паттерна корректно выполняется. (см. 16759858 )
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / CaptureCollection и Capture в Java regex
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]