Регулярное выражение в Java — пример Java Regex
Добро пожаловать в регулярные выражения в Java. Это также называется Regex в Java. Когда я начал программировать, регулярные выражения Java были для меня кошмаром. Этот учебник призван помочь вам освоить регулярное выражение в Java. Я также вернусь сюда, чтобы обновить свои знания Java Regex.
Регулярное выражение в Java
- Шаблон: объект
Шаблон
представляет собой скомпилированную версию регулярного выражения. Класс шаблона не имеет общедоступного конструктора, и мы используем его общедоступный статический методcompile
для создания объекта шаблона путем передачи аргумента регулярного выражения. - Matcher:
Matcher
– это объект механизма регулярных выражений Java, который сопоставляет входной шаблон String с созданным объектом шаблона. Класс Matcher не имеет общедоступного конструктора, и мы получаем объект Matcher, используя метод объекта шаблонаmatcher
, который принимает входную строку в качестве аргумента. Затем мы используем методmatches
, который возвращает логический результат на основе входной строки, соответствует шаблону регулярного выражения или нет. - PatternSyntaxException:
PatternSyntaxException
создается, если синтаксис регулярного выражения неверен.
Давайте посмотрим на пример программы Java Regex.
package com.journaldev.util;
import java.util.regex.*;
public class PatternExample {
public static void main(String[] args) {
Pattern pattern = Pattern.compile(".xx.");
Matcher matcher = pattern.matcher("MxxY");
System.out.println("Input String matches regex - "+matcher.matches());
// bad regular expression
pattern = Pattern.compile("*xx*");
}
}
Когда мы запускаем этот пример программы регулярного выражения Java, мы получаем результат ниже.
Input String matches regex - true
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
*xx*
^
at java.util.regex.Pattern.error(Pattern.java:1924)
at java.util.regex.Pattern.sequence(Pattern.java:2090)
at java.util.regex.Pattern.expr(Pattern.java:1964)
at java.util.regex.Pattern.compile(Pattern.java:1665)
at java.util.regex.Pattern.(Pattern.java:1337)
at java.util.regex.Pattern.compile(Pattern.java:1022)
at com.journaldev.util.PatternExample.main(PatternExample.java:13)
Поскольку регулярное выражение Java вращается вокруг String, класс String был расширен в Java 1.4, чтобы предоставить метод matches
, который выполняет сопоставление шаблонов регулярных выражений. Внутри он использует классы регулярных выражений Java Pattern
и Matcher
для выполнения обработки, но, очевидно, это сокращает количество строк кода. Класс Pattern
также содержит метод matches
, который принимает регулярное выражение и входную строку в качестве аргумента и возвращает логический результат после их сопоставления. Таким образом, приведенный ниже код отлично работает для сопоставления входной строки с регулярным выражением в Java.
String str = "bbb";
System.out.println("Using String matches method: "+str.matches(".bb"));
System.out.println("Using Pattern matches method: "+Pattern.matches(".bb", str));
Поэтому, если вам нужно просто проверить, соответствует ли входная строка шаблону, вы должны сэкономить время и строки кода, используя простой метод сопоставления строк. Вы должны использовать классы Pattern и Matches только тогда, когда вам нужно манипулировать входной строкой или вам нужно повторно использовать шаблон. Обратите внимание, что шаблон, определенный регулярным выражением, применяется к строке слева направо, и после того, как исходный символ используется в совпадении, его нельзя использовать повторно. Например, регулярное выражение \121 будет соответствовать \31212142121 только дважды, чем \_121____121.
Регулярное выражение в Java — общие совпадающие символы
Regular Expression | Description | Example |
---|---|---|
. | Matches any single character | (“…”, “a%”) – true(“…”, “.a”) – true (“…”, “a”) – false |
^aaa | Matches aaa regex at the beginning of the line | (“^a.c.”, “abcd”) – true (“^a”, “ac”) – false |
aaa$ | Matches regex aaa at the end of the line | (“…cd$”, “abcd”) – true(“a$”, “a”) – true (“a$”, “aca”) – false |
[abc] | Can match any of the letter a, b or c. [] are known as character classes. | (“^[abc]d.”, “ad9”) – true(“[ab].d$”, “bad”) – true (“[ab]x”, “cx”) – false |
[abc][12] | Can match a, b or c followed by 1 or 2 | (“[ab][12].”, “a2#”) – true(“[ab]…[12]”, “acd2”) – true (“[ab][12]”, “c2”) – false |
[^abc] | When ^ is the first character in [], it negates the pattern, matches anything except a, b or c | (“[^ab][^12].”, “c3#”) – true(“[^ab]…[^12]”, “xcd3”) – true (“[^ab][^12]”, “c2”) – false |
[a-e1-8] | Matches ranges between a to e or 1 to 8 | (“[a-e1-3].”, “d#”) – true(“[a-e1-3]”, “2”) – true (“[a-e1-3]”, “f2”) – false |
xx | yy | Matches regex xx or yy |
Метасимволы регулярных выражений Java
У нас есть некоторые метасимволы в регулярном выражении Java, это как шорткоды для общих шаблонов сопоставления.
Regular Expression | Description |
---|---|
\d | Any digits, short of [0-9] |
\D | Any non-digit, short for [^0-9] |
\s | Any whitespace character, short for [\t\n\x0B\f\r] |
\S | Any non-whitespace character, short for [^\s] |
\w | Any word character, short for [a-zA-Z_0-9] |
\W | Any non-word character, short for [^\w] |
\b | A word boundary |
\B | A non word boundary |
Существует два способа использования метасимволов в качестве обычных символов в регулярных выражениях.
- Поставьте перед метасимволом обратную косую черту (\).
- Сохраняйте метасимволы внутри \Q (с которого начинается кавычка) и \E (с которого она заканчивается).
Регулярные выражения в Java — квантификаторы
Квантификаторы регулярных выражений Java определяют количество вхождений символа для сопоставления.
Regular Expression | Description |
---|---|
x? | x occurs once or not at all |
X* | X occurs zero or more times |
X+ | X occurs one or more times |
X{n} | X occurs exactly n times |
X{n,} | X occurs n or more times |
X{n,m} | X occurs at least n times but not more than m times |
Java Regex Quantifiers также можно использовать с классами символов и группами захвата. Например, [abc]+ означает - a, b или c - один или несколько раз. (abc)+ означает группу \abc еще раз. Теперь мы обсудим группу захвата.
Регулярные выражения в Java — захват групп
Регулярное выражение в группах Java Capturing используется для обработки нескольких символов как единого блока. Вы можете создать группу, используя ()
. Часть входной строки, которая соответствует группе захвата, сохраняется в памяти и может быть вызвана с помощью обратной ссылки. Вы можете использовать метод matcher.groupCount
, чтобы узнать количество групп захвата в шаблоне регулярного выражения Java. Например, ((a)(bc)) содержит 3 группы захвата: ((a)(bc)), (a) и (bc) . Вы можете использовать обратную ссылку в регулярном выражении с обратной косой чертой (\), а затем с номером группы, которую нужно отозвать. Захват групп и обратных ссылок может сбивать с толку, поэтому давайте разберемся с этим на примере.
System.out.println(Pattern.matches("(\\w\\d)\\1", "a2a2")); //true
System.out.println(Pattern.matches("(\\w\\d)\\1", "a2b2")); //false
System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1", "ABB2B2AB")); //true
System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1", "ABB2B3AB")); //false
В первом примере первой группой захвата во время выполнения является (\w\d), которая оценивается как \a2 при сопоставлении с входной строкой \a2a2 и сохраняется в памяти. Итак, \1 ссылается на \a2 и, следовательно, возвращает true. По той же причине второй оператор печатает false. Попробуйте сами понять этот сценарий для операторов 3 и 4. :) Теперь мы рассмотрим некоторые важные методы Классы Pattern и Matcher.
- Мы можем создать объект Pattern с флагами. Например,
Pattern.CASE_INSENSITIVE
включает сопоставление без учета регистра. - Класс Pattern также предоставляет метод
split(String)
, аналогичный методуsplit()
класса String. - Метод
toString()
класса шаблона возвращает регулярное выражение String, из которого был скомпилирован этот шаблон. - В классах Matcher есть индексные методы
start()
иend()
, которые точно показывают, где во входной строке было найдено совпадение. - Класс Matcher также предоставляет методы обработки строк
replaceAll(замена строки)
иreplaceFirst(замена строки)
.
Давайте рассмотрим эти методы регулярных выражений Java в простой примерной программе.
package com.journaldev.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
public static void main(String[] args) {
// using pattern with flags
Pattern pattern = Pattern.compile("ab", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("ABcabdAb");
// using Matcher find(), group(), start() and end() methods
while (matcher.find()) {
System.out.println("Found the text \"" + matcher.group()
+ "\" starting at " + matcher.start()
+ " index and ending at index " + matcher.end());
}
// using Pattern split() method
pattern = Pattern.compile("\\W");
String[] words = pattern.split("one@two#three:four$five");
for (String s : words) {
System.out.println("Split using Pattern.split(): " + s);
}
// using Matcher.replaceFirst() and replaceAll() methods
pattern = Pattern.compile("1*2");
matcher = pattern.matcher("11234512678");
System.out.println("Using replaceAll: " + matcher.replaceAll("_"));
System.out.println("Using replaceFirst: " + matcher.replaceFirst("_"));
}
}
Вывод приведенного выше примера программы регулярных выражений Java:
Found the text "AB" starting at 0 index and ending at index 2
Found the text "ab" starting at 3 index and ending at index 5
Found the text "Ab" starting at 6 index and ending at index 8
Split using Pattern.split(): one
Split using Pattern.split(): two
Split using Pattern.split(): three
Split using Pattern.split(): four
Split using Pattern.split(): five
Using replaceAll: _345_678
Using replaceFirst: _34512678
Это все, что касается регулярных выражений в Java. Поначалу Java Regex кажется сложным, но если вы поработаете с ним какое-то время, его легко освоить и использовать.
Вы можете получить полный код и другие примеры регулярных выражений в нашем репозитории GitHub.