Иногда у нас есть требование, когда нам нужно отфильтровать строки из журналов, которые начинаются с определенного слова ИЛИ заканчиваются определенным словом. В этом руководстве по границе слов 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.