Контент, над которым я работаю:
dontAccessMe:
abc
def
accessMe:
xyz
xyzt
foo
bar
Мне нужно записать трехбуквенные слова в строках под фразой accessMe:
. Какие: xyz foo bar
.
Как мне добиться этого?
Я пробовал (?<=accessMe:)\s*(\w{3})
, и он останавливается после первого совпадающего слова.
Я пишу регулярное выражение на языке Java 15.
@ WiktorStribiżew это ломается, когда у меня есть что-то, что не соответствует ниже accessMe:
.
Да, это не проблема, вы можете решить ее с помощью (?m)(?:\G(?!\A)(?:\R++(?!\w{3}$).*)*\R+|accessMe:\R)(\w{3})$
see, см. демонстрация.
Здесь вам не нужно 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)
Ну что,
(?m)(?:\G(?!\A)\R+|accessMe:\R)(\w{3})$
?