Как получить больше групповых совпадений после определенной строки? - PullRequest
1 голос
/ 01 июня 2019

Как можно получить больше групп регулярного выражения?

Я хочу извлечь подстроки из следующей строки:

group g1 l1 l2 l3 g2 g3.l1

в виде групп.Вывод должен включать g1, l1, l2, l3, g2 и g3.l1.

Я уже пытался получить их с помощью регулярных выражений, таких как:

group (\S+)\s(\S+)*

Моя проблема в том, чтоЯ мог бы получить разные группы с помощью выражения group (), но я могу получить больше или меньше этих подстрок.Моя строка также может выглядеть так: group g1 g2.l1

Ответы [ 2 ]

0 голосов
/ 02 июня 2019

Если мы хотим захватить эти буквенно-цифровые символы, разделенные пробелом, и отдельно захватить слово group, мы можем создать простое выражение, используя изменение:

(group|another_group)|([^\s]+)

, которое мы здесь просто передадим группеили, если есть, другие группы:

(group|another_group)

, затем мы собираем все, кроме пробелов, используя:

([^\s]+)

Демо

Тест

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "(group|another_group)|([^\\s]+)";
final String string = "group g1 l1 l2 l3 g2 g3.l1\n"
     + "another_group g1 l1 l2 l3 g2 g3.l1";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

0 голосов
/ 01 июня 2019

Ваш шаблон начинается с совпадения group, а затем использует 2 группы захвата.Вы получаете только 2 группы, потому что повторение в последней группе повторяет совпадение только с непробельным символом \S и не будет совпадать с пробельным символом.

Если вы измените это значение на (\s\S+)*, вы повторите захватгруппа захватывает только значение последнего повторения.

Что вы можете сделать, это использовать \G для получения повторяющихся совпадений, утверждая позицию в конце предыдущего совпадения

(?:^group |\G(?!^))(\S+)(?:\s+|$)

В java

String regex = "(?:^group |\\G(?!^))(\\S+)(?:\\s+|$)";

Это будет соответствовать

  • (?: Группа без захвата
    • ^group Группа совпадений и пробел в строке строки
    • | Или
    • \G(?!^) Утверждение позиции в конце предыдущего матча, а не в начале строки
  • ) Закрыть группу без захвата
  • (\S+) Захват в группе 1, соответствующих 1+ непробельным символам
  • (?:\s+|$) Совпадение с 1+ пробельными символами или утверждением конца строки

Regex demo | Java демо

Например

String regex = "(?:^group |\\G(?!^))(\\S+)(?:\\s+|$)";
String string = "group g1 l1 l2 l3 g2 g3.l1";

Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}

Результат

g1
l1
l2
l3
g2
g3.l1
...