Добро пожаловать в регулярные выражения в Java. Их также называют Regex в Java. Когда я начал программировать, регулярные выражения в Java казались для меня кошмаром. Этот учебник призван помочь вам освоить регулярные выражения в Java. Я также вернусь сюда, чтобы освежить свои знания по Java Regex.
Регулярные выражения в Java
Регулярное выражение в Java определяет шаблон для строки. Регулярные выражения можно использовать для поиска, редактирования или манипулирования текстом. Регулярное выражение не зависит от языка, но они немного различаются для каждого языка. Регулярные выражения в Java наиболее похожи на Perl. Классы Java Regex находятся в пакете
java.util.regex
и содержат три класса:
- Pattern: Объект
Pattern
– это скомпилированная версия регулярного выражения. У класса Pattern нет открытого конструктора, и мы используем его открытый статический методcompile
для создания объекта шаблона, передавая аргумент регулярного выражения. - Matcher:
Matcher
– объект движка Java Regex, который сопоставляет входную строку с созданным объектом шаблона. У класса Matcher нет общедоступного конструктора, и мы получаем объект Matcher, используя методmatcher
объекта шаблона, который принимает входную строку в качестве аргумента. Затем мы используем методmatches
, который возвращает логический результат в зависимости от того, соответствует ли входная строка шаблону regex или нет. - PatternSyntaxException:
PatternSyntaxException
выбрасывается, если синтаксис регулярного выражения неверен.
Давайте рассмотрим пример программы на языке Java с использованием регулярных выражений.
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());
// неверное регулярное выражение
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 был расширен в Java 1.4 для предоставления метода matches
, выполняющего сопоставление шаблона regex. Внутренне он использует классы регулярных выражений 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 и Matcher следует использовать только тогда, когда необходимо манипулировать входной строкой или переиспользовать шаблон. Обратите внимание, что шаблон, определенный с использованием регулярных выражений, применяется к строке слева направо, и после использования символа источника в совпадении он не может быть повторно использован. Например, регулярное выражение “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 Regex
В 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 Regex указывают количество вхождений символа для сопоставления.
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 могут использоваться также с символьными классами и захватывающими группами. Например, [abc]+ означает – a, b или c – один или более раз. (abc)+ означает группу “abc” один или более раз. Сейчас мы обсудим Группу захвата.
Регулярные выражения в Java – Группы захвата
В Java группы захвата регулярных выражений используются для обработки нескольких символов как единого блока. Вы можете создать группу, используя ()
. Часть строки ввода, которая соответствует группе захвата, сохраняется в памяти и может быть вызвана с использованием Обратная ссылка. Метод 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()
класса Pattern возвращает строку регулярного выражения, из которого был скомпилирован этот шаблон. - У классов Matcher есть методы индекса
start()
иend()
, которые показывают точное место совпадения во входной строке. - Класс Matcher также предоставляет методы манипулирования строкой
replaceAll(String replacement)
иreplaceFirst(String replacement)
.
Давайте рассмотрим эти методы java regex в простом примере программы.
package com.journaldev.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
public static void main(String[] args) {
// использование шаблона с флагами
Pattern pattern = Pattern.compile("ab", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("ABcabdAb");
// использование методов find(), group(), start() и end() Matcher
while (matcher.find()) {
System.out.println("Found the text \"" + matcher.group()
+ "\" starting at " + matcher.start()
+ " index and ending at index " + matcher.end());
}
// использование метода split() Pattern
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);
}
// использование методов replaceFirst() и replaceAll() Matcher
pattern = Pattern.compile("1*2");
matcher = pattern.matcher("11234512678");
System.out.println("Using replaceAll: " + matcher.replaceAll("_"));
System.out.println("Using replaceFirst: " + matcher.replaceFirst("_"));
}
}
Вывод примера программы java regex приведен выше.
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 кажутся сложными сначала, но если вы поработаете с ними некоторое время, их легко освоить и использовать.
Вы можете ознакомиться с полным кодом и другими примерами регулярных выражений в нашем репозитории GitHub.
Source:
https://www.digitalocean.com/community/tutorials/regular-expression-in-java-regex-example