Регулярное выражение для поиска совпадений в многострочной строке после определенной фразы

Контент, над которым я работаю:

dontAccessMe:
abc
def

accessMe:
xyz
xyzt
foo
bar

Мне нужно записать трехбуквенные слова в строках под фразой accessMe:. Какие: xyz foo bar.

Как мне добиться этого?

Я пробовал (?<=accessMe:)\s*(\w{3}), и он останавливается после первого совпадающего слова.

Я пишу регулярное выражение на языке Java 15.

Ну что, (?m)(?:\G(?!\A)\R+|accessMe:\R)(\w{3})$?

Wiktor Stribiżew 30.03.2021 00:55

@ WiktorStribiżew это ломается, когда у меня есть что-то, что не соответствует ниже accessMe:.

lorenium 30.03.2021 15:20

Да, это не проблема, вы можете решить ее с помощью (?m)(?:\G(?!\A)(?:\R++(?!\w{3}$).*)*\R+|accessMe:\R)(\w{3})$ see, см. демонстрация.

Wiktor Stribiżew 30.03.2021 15:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
52
1

Ответы 1

Здесь вам не нужно Regex. Воспользуйтесь преимуществом, которое дает вам Java. Предполагая, что ввод является строкой, вы можете использовать метод Stream#dropWhile после того, как разделите строку с помощью разделителя новой строки \n.

Arrays.stream(string.split("\\n"))                // split each line to a String
      .dropWhile(str -> !str.equals("accessMe:")) // ignore until "accessMe:" is reached
      .skip(1)                                    // skip "accessMe:" itself
      .forEach(System.out::println);              // print them out or collect

Если входом является сам List<String>, вы можете напрямую вызвать .stream().dropWhile(..) на нем без разделения.

I need to capture 3-letter word

Вы можете использовать дополнительный filter, если вы действительно ограничены соответствием только трехбуквенным словам. Поместите его после вызова метода skip:

      .filter(str -> str.length() == 3)

Другие вопросы по теме