Автор оригинала: Pankaj Kumar.
Добро пожаловать в Регулярное выражение на Java. Это также называется регулярным выражением на Java. Когда я начал программировать, регулярное выражение java было для меня кошмаром. Этот учебник призван помочь вам освоить регулярное выражение в Java. Я также вернусь сюда, чтобы освежить свое изучение регулярных выражений Java.
Регулярное выражение в Java
Регулярное выражение в java определяет шаблон для строки. Регулярное выражение можно использовать для поиска, редактирования или манипулирования текстом. Регулярное выражение не зависит от языка, но они немного отличаются для каждого языка. Регулярное выражение в Java наиболее похоже на Perl.
Классы регулярных выражений Java присутствуют в java.util.regex
пакете, содержащем три класса:
- Шаблон :
Шаблон
объект – это скомпилированная версия регулярного выражения. Класс шаблона не имеет открытого конструктора, и мы используем его общедоступный статический методcompile
для создания объекта шаблона путем передачи аргумента регулярного выражения. - Сопоставитель :
Сопоставитель
– это объект механизма регулярных выражений java, который сопоставляет шаблон входной строки с созданным объектом шаблона. Класс Matcher не имеет открытого конструктора, и мы получаем объект Matcher, используя метод pattern objectmatcher
, который принимает входную строку в качестве аргумента. Затем мы используем методmatches
, который возвращает логический результат на основе входной строки, соответствующей шаблону регулярного выражения или нет. - Исключение 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()); // 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 был расширен в Java 1.4, чтобы предоставить метод matches
, который выполняет сопоставление шаблонов регулярных выражений. Внутренне он использует классы регулярных выражений Pattern
и Matcher
java для обработки, но, очевидно, это уменьшает количество строк кода.
Шаблон
класс также содержит соответствует
методу, который принимает регулярное выражение и входную строку в качестве аргумента и возвращает логический результат после их сопоставления.
Поэтому приведенный ниже код отлично подходит для сопоставления входной строки с регулярным выражением в 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 – общие совпадающие символы
(“..”, “a%”) – истина(“..”, “.a”) – истина(“..”, “a”) – ложь | Соответствует любому отдельному символу | . |
(“^a.c.”, “abcd”) – истина(“^a”, “ac”) – ложь | Соответствует регулярному выражению aaa в начале строки | ^ааа |
(“..cd$”, “abcd”) – истина(“a$”, “a”) – истина(“a$”, “aca”) – ложь | Соответствует регулярному выражению aaa в конце строки | ааа$ |
(“^[abc]d.”, “ad9”) – истина(“[ab].d$”, “плохо”) – истина(“[ab]x”, “cx”) – ложь | Может соответствовать любой букве a, b или c. [] известны как классы символов. | [abc] |
(“[ab][12].”, “a2#”) – истина(“[ab]..[12]”, “acd2”) – истина(“[ab][12]”, “c2”) – ложь | Может совпадать с a, b или c, за которыми следует 1 или 2 | [abc][12] |
(“[^ab][^12].”, “c3#”) – истина(“[^ab]..[^12]”, “xcd3”) – истина(“[^ab][^12]”, “c2”) – ложь | Когда ^ является первым символом в [], он отрицает шаблон, соответствует чему угодно, кроме a, b или c | [^abc] |
(“[a-e1-3].”, “d#”) – верно(“[a-e1-3]”, “2”) – истина(“[a-e1-3]”, “f2”) – ложь | Совпадения варьируются от а до е или от 1 до 8 | [a-e1-8] |
(“x.|y”, “xa”) – истина(“x.|y”, “y”) – истина (“x.|y”, “yz”) – ложь | Соответствует регулярному выражению xx или yy | xx|гг |
Метасимволы регулярных выражений Java
У нас есть некоторые мета-символы в регулярных выражениях Java, это похоже на короткие коды для общих шаблонов сопоставления.
Любые цифры, кроме [0-9] | \d |
Любая нецифровая цифра, сокращение от [^0-9] | \D |
Любой символ пробела, сокращение от [\t\n\x0B\f\r] | \s |
Любой символ без пробелов, сокращение от [^\s] | \S |
Любой символ слова, сокращение от [a-zA-Z_0-9] | \w |
Любой не-словесный символ, сокращение от [^\w] | \W |
Граница слов | \b |
Граница без слов | \B |
Существует два способа использования метасимволов в качестве обычных символов в регулярных выражениях.
- Перед метасимволом ставьте обратную косую черту (\).
- Держите метасимвол в пределах \Q (с которого начинается цитата) и \E (которым она заканчивается).
Регулярное выражение в Java – Кванторах
Кванторы регулярных выражений Java определяют количество вхождений символа для сопоставления.
x происходит один раз или не происходит вообще | икс? |
X встречается ноль или более раз | X* |
X встречается один или несколько раз | X+ |
X происходит ровно n раз | X{n} |
X встречается n или более раз | X{n,} |
X встречается не менее n раз, но не более m раз | X{n,m} |
Кванторы регулярных выражений Java также можно использовать с классами символов и группами захвата.
Например, [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), которая оценивается как “a 2” при сопоставлении с входной строкой “a2 a2” и сохраняется в памяти. Таким образом, \1 относится к “a2” и, следовательно, возвращает значение true. По той же причине второе утверждение выводит false.
Попробуйте сами понять этот сценарий для утверждений 3 и 4. 🙂
Теперь мы рассмотрим некоторые важные методы классов шаблонов и сопоставителей.
- Мы можем создать объект шаблона с флагами. Например
Шаблон.CASE_INSENSITIVE
включает сопоставление без учета регистра. - Класс шаблона также предоставляет
split(строка)
метод, аналогичный классу строкsplit()
метод. - Класс шаблона
toString()
метод возвращает строку регулярного выражения, из которой был скомпилирован этот шаблон. - Классы сопоставления имеют методы
start()
иend()
index, которые точно показывают, где было найдено совпадение во входной строке. - Класс 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 поначалу кажутся сложными, но если вы работаете с ними в течение некоторого времени, их легко изучать и использовать.