Regex Boundary Matcher: Сопоставление Begin-with / End-with

Иногда у нас есть требование, когда нам нужно отфильтровать строки из журналов, которые начинаются с определенного слова ИЛИ заканчиваются определенным словом. В этом руководстве по границе слов Java regex мы научимся создавать regex для фильтрации строк, которые начинаются или заканчиваются определенным словом.

1. Сопоставители границ

Граничные сопоставители — это специальные символы или последовательности, используемые в регулярных выражениях(regex) для сопоставления определенных позиций в строке или тексте. Граничные сопоставители не сопоставляют какие-либо реальные символы, а вместо этого сопоставляют позиции или границы между символами, эффективно привязывая соответствие регулярного выражения к этим позициям.

В следующей таблице перечислены и объяснены все сопоставители границ.

Сопоставитель Описание Пример выражения Совпадает/Не совпадает
^ Начало строки ^Привет Соответствует строкам, начинающимся с «Hello»
$ Конец строки мир$ Соответствует строкам, заканчивающимся на «world»
Граница слова \bcat\b Соответствует целому слову «cat»
Не соответствует «catch» или «category»
Граница, не связанная со словом \Bcat\B Соответствует «catch» или «category»
Не соответствует всему слову «cat»
Начало ввода \АПривет Соответствует строкам, начинающимся с «Hello»
Конец предыдущего матча \Gword Соответствует «слову» сразу после предыдущего совпадения
\Z Конец ввода
(исключая последний терминатор строки)
мир\Z Соответствует «world» в конце входной строки
Конец ввода мир\z Соответствует слову «world» только в самом конце входной строки.

2. Пример сопоставления границ регулярных выражений

Следующий пример кода Java демонстрирует использование каждого символа сопоставления границ в регулярных выражениях.

Флаг Pattern.MULTILINE используется для включения многострочного режима для шаблонов регулярных выражений.

import java.util.regex.*;public class BoundaryMatcherExample {public static void main(String[] args) {// Define a multiline string using text blockString input = """Hello worldGoodbye worldCatch a catcatamaran""";// Define a StringBuilder to capture the outputStringBuilder output = new StringBuilder();// ^ - Beginning of LinePattern beginningPattern = Pattern.compile("^Hello", Pattern.MULTILINE);Matcher beginningMatcher = beginningPattern.matcher(input);while(beginningMatcher.find()) {output.append("Match found(Beginning of Line): ").append(beginningMatcher.group()).append("\n");}// $ - End of LinePattern endPattern = Pattern.compile("world$", Pattern.MULTILINE);Matcher endMatcher = endPattern.matcher(input);while(endMatcher.find()) {output.append("Match found(End of Line): ").append(endMatcher.group()).append("\n");}// \b - Word BoundaryPattern wordBoundaryPattern = Pattern.compile("\\bcat\\b", Pattern.MULTILINE);Matcher wordBoundaryMatcher = wordBoundaryPattern.matcher(input);while(wordBoundaryMatcher.find()) {output.append("Match found(Word Boundary): ").append(wordBoundaryMatcher.group()).append("\n");}// \B - Non-Word BoundaryPattern nonWordBoundaryPattern = Pattern.compile("\\Bcat\\B", Pattern.MULTILINE);Matcher nonWordBoundaryMatcher = nonWordBoundaryPattern.matcher(input);while(nonWordBoundaryMatcher.find()) {output.append("Match found(Non-Word Boundary): ").append(nonWordBoundaryMatcher.group()).append("\n");}// \A - Beginning of InputPattern beginningInputPattern = Pattern.compile("\\AHello");Matcher beginningInputMatcher = beginningInputPattern.matcher(input);while(beginningInputMatcher.find()) {output.append("Match found(Beginning of Input): ").append(beginningInputMatcher.group()).append("\n");}// \G - End of Previous MatchPattern endPreviousPattern = Pattern.compile("\\Goo");Matcher endPreviousMatcher = endPreviousPattern.matcher(input);while(endPreviousMatcher.find()) {output.append("Match found(End of Previous Match): ").append(endPreviousMatcher.group()).append("\n");}// \Z - End of Input(excluding final line terminator)Pattern endInputPattern = Pattern.compile("world\\Z", Pattern.MULTILINE);Matcher endInputMatcher = endInputPattern.matcher(input);while(endInputMatcher.find()) {output.append("Match found(End of Input excluding final line terminator): ").append(endInputMatcher.group()).append("\n");}// \z - End of InputPattern endInputAbsolutePattern = Pattern.compile("world\\z", Pattern.MULTILINE);Matcher endInputAbsoluteMatcher = endInputAbsolutePattern.matcher(input);while(endInputAbsoluteMatcher.find()) {output.append("Match found(End of Input): ").append(endInputAbsoluteMatcher.group()).append("\n");}// Print the captured outputSystem.out.println(output.toString());}}

Вывод программы:

Match found(Beginning of Line): HelloMatch found(End of Line): worldMatch found(Word Boundary): catMatch found(Non-Word Boundary): catMatch found(Non-Word Boundary): catMatch found(Beginning of Input): HelloMatch found(End of Previous Match): oMatch found(End of Previous Match): oMatch found(End of Input excluding final line terminator): worldMatch found(End of Input): world

В этом выводе указано, где в многострочной входной строке было найдено каждое совпадение, согласно соответствующему шаблону регулярного выражения.

Поделитесь своими мыслями об этом примере границы слова в регулярном выражении Java.

Ссылки: Документация по регулярным выражениям Java

Прокрутить вверх