Регулярные выражения в Java
Концепция регулярных выражений возникла еще в 1950-х. Это способ поиска информации в строках с помощью шаблонов, записанных спецсимволами.
Технологию впервые использовал разработчик систем Unix Кен Томпсон в текстовом редакторе ed в 1968 году.
Java часто применяют для работы с регулярными выражениями: их поддержка — часть стандартной библиотеки java.util.regex.
Разобрались, что такое регулярные выражения в Java и как они помогают обрабатывать большие массивы строчных данных.
Что такое регулярные выражения
Для простых операций по обработке текстовой информации в языке Java можно использовать маски имен файлов. Таким способом легко скопировать все файлы, которые начинаются с буквы R.
Регулярные выражения — более продвинутый способ поиска соответствий или ошибок в тексте. Это набор символов (шаблон), который ищет соответствия в файле. Их часто применяют для обработки текста или редактирования, а также в создании скриптов для проверки на валидность. Например, чтобы проверить, отвечает ли заданный пароль условиям сервиса.
Классы библиотеки регулярных выражений
Пакет java.util.regex состоит из набора классов, которые применяют для согласования последовательностей символов с шаблонами, заданных выражениями.
Есть три ключевых класса:
- Pattern — набор команд и точка доступа к API регулярных выражений на Java.
- Matcher — класс, который сопоставляет результаты расшифровки класса Pattern с остальной частью программы.
Основные методы Matcher:
- 1. boolean matches выдает значение true, когда строка соответствует шаблону (Pattern);
- 2. boolean find выдает значение true, когда в строке есть подстрока, которая соответствует шаблону;
- 3. string group выдает подстроку, которая совпала с шаблоном после вызова метода find;
- 4. string replaceAll(String str) меняет все строки, соответствующие шаблону, и выдает результат с изменениями.
- PatternSyntaxException срабатывает в случае исключений (синтаксических ошибок).
Класс Pattern используют для задания регулярного выражения, а Matcher находит в коде последовательности символов.
статьи по теме:
Какие инструменты разработки используют чаще других.
Инженеры из Amazon и Sterlix GmbH делятся опытом.
Синтаксис регулярных выражений Java
Регулярные выражения записывают с помощью обычных символов, наборов символов и групповых символов.
Проще всего — поиск обычных текстовых символов. Символы, которые обозначают сами себя, называют литералами. Например, если в шаблон задать слово dog, то он будет искать в строке все случаи, когда слова начинаются с этих символов. Например, слова dog и doghunter попадут в выдачу.
Квадратные скобки и циркумфлекс (^) отображают не собственный символ, а команду. Такие символы называют метасимволами или спецсимволами. Если разместить символ ^ в квадратных скобках ( [^dog] ), то matcher будет искать все символы, кроме буквосочетания dog.
Метасимволы для поиска соответствий и границ строк
- ^ — начало строки;
- $ — конец строки;
- — — задать один символ, которого не должно быть в скобках;
- \b — конец слова;
- \B — не конец слова;
- \A — начало ввода;
- \Z — конец ввода.
Классы символов
Регулярные выражения позволяют работать с классами символов. Например:
- \d — любой цифровой символ;
- \D — любой нецифровой;
- \s — символ пробела;
- \S — непробельный символ;
- . — задать один произвольный символ;
- \w — буквенно-цифровой символ;
- \W — любой символ, кроме буквенно-цифрового.
Задать диапазон символов можно с помощью символа -. Тогда регулярное выражение (a-z) будет искать все символы в диапазоне.
Некоторые команды начинаются с обратной косой черты \. Это значит, что следующий символ используют как спецсимвол. Например, сочетание косой черты и символа n — \n — будет означать перенос строки.
Иногда нужно экранировать символы, то есть вывести на экран знаки, которые программа обычно воспринимает как системные. Так, знак + обозначает появление другого символа один и более раз. Чтобы отобразить на экране сам плюс, нужно использовать две косые черты: \\+, так как одинарная косая черта \ тоже является спецсимволом.
курсы по теме:
Прогнозирование и анализ временных рядов
Регулярные выражения
Регулярное выражение — это своего рода шаблон, который может быть применен к тексту. Java предоставляет пакет java.util.regex для сопоставления с регулярными выражениями.
Регулярное выражение или соответствует тексту (его части) или нет. Если регулярное выражение совпадает с частью текста, то мы можем найти его. Если регулярное выражение составное, то мы можем легко выяснить, какая часть регулярного выражения совпадает с какой частью текста.
Например, есть следующая строка:
Используются файлы file1.doc, file2.txt. А еще было бы неплохо обратить внимание на файл file3.img. Также просмотрите содержимое file4.doc.
Из строки нужно вырезать все имена файлов: file1.doc, file2.txt, file3.img, file4.doc. Для нахождения используется регулярное выражение:
[a-zA-Z]+\\.[a-z]
Регулярное выражение [a-z]+ соответствует всем строчным буквам в тексте. [a-z] означает любой символ от a до z включительно, и + означает «один или более» символов.
Рассмотрим пример нахождения регулярного выражения в тексте:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexDemo1 < public static void main(String[] args) < String stringPattern = "[a-z]+"; String text = "code 2 learn java tutorial"; Pattern pattern = Pattern.compile(stringPattern); Matcher matcher = pattern.matcher(text); while (matcher.find()) < System.out.println(text.substring(matcher.start(), matcher.end())); >> >
2. Pattern и Matcher классы
Pattern класс — объект класса составляет представление регулярного выражения. Класс Pattern не предусматривает никаких публичных конструкторов. Чтобы создать шаблон, необходимо сначала вызвать один из публичных статических методов, которые затем возвращают объект класса Pattern. Эти методы принимают регулярное выражение в качестве аргумента.
Matcher класс — объект «Искатель» является двигателем, который интерпретирует шаблон и выполняет операции сопоставления с входной строкой. Как и Pattern класс, Matcher не имеет публичных конструкторов. Вы получаете объект Matcher вызовом метода matcher(), на объекте класса Pattern.
Методы класса Matcher:
- matches() возвращает true , если шаблон соответствует всей строке, иначе false .
- lookingAt() возвращает true , если шаблон соответствует началу строки, и false в противном случае.
- find() возвращает true , если шаблон совпадает с любой частью текста.
3. Основные мета символы
^ | (крышка) начало проверяемой строки. |
$ | (доллар) конец проверяемой строки. |
. | (точка) представляет собой сокращенную форму записи для символьного класса, совпадающего с любым символом. |
| | Означает «или». Подвыражения, объединенные этим способом, называются альтернативами (alternatives). |
? | (знак вопроса) означает, что предшествующий ему символ является необязательным. |
+ | Обозначает «один или несколько экземпляров непосредственно предшествующего элемента. |
* | Любое количество экземпляров элемента (в том числе и нулевое). |
\\d | Цифровой символ. |
\\D | Не цифровой символ. |
\\s | Пробельный символ. |
\\S | Не пробельный символ. |
\\w | Буквенный(латиница), цифровой символ или знак подчёркивания. |
\\W | Любой символ, кроме буквенного, цифрового символа или знака подчёркивания. |
[abc] | Диапазон символов или цифр. |
Примеры регулярных выражений:
a? - a один раз или ни разу a* - a ноль или более раз a+ - a один или более раз a - a n раз a- a n или более раз a- a от n до m
4. Сравнение регулярного выражения с текстом
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexDemo2 < public static void main(String[] args) < Pattern pattern = Pattern.compile("a*b"); Matcher matcher = pattern.matcher("aaab"); boolean b = matcher.matches(); System.out.println(b); >>
5. Простой валидатор ссылки
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexDemo3 < public static void main(String[] args) < System.out.println(test("google.com")); System.out.println(test("reference1.ua")); System.out.println(test("reference1.org")); >public static boolean test(String testString) < Pattern pattern = Pattern.compile(".+\\.(com|ua|ru)"); Matcher matcher = pattern.matcher(testString); return matcher.matches(); >>
6. Регулярное выражение для проверки email
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexDemo4 < public static void main(String[] args) < String regex = "(\\w)@(\\w+\\.)([a-z])"; String s = "адреса эл.почты:ivanov@gmail.com, sidorov@bsu.by!"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(s); while (matcher.find()) < System.out.println("e-mail: " + matcher.group()); >> >
7. Методы Pattern.split(), String.split()
Класс Pattern содержит метод split() , который разбивает строку на подстроки, используя указанный в шаблоне разделитель:
import java.util.Arrays; import java.util.regex.Pattern; public class RegexDemo5 < public static void main(String[] args) < Pattern pattern = Pattern.compile("\\d+\\s?"); String[] words = pattern.split("java5tiger 77 java6mustang"); System.out.print(Arrays.toString(words)); >>
Класс String определяет такой же метод split() :
import java.util.Arrays; public class RegexDemo6 < public static void main(String[] args) < String str = "java5tiger 77 java6mustang"; String[] words = str.split("\\d+\\s?"); System.out.print(Arrays.toString(words)); >>
Регулярные выражения
Пакет java.util.regex поддерживает обработку регулярных выражений (regular expression).
Регулярные выражения используются некоторыми текстовыми редакторами и утилитами для поиска и подстановки текста. Например, при помощи регулярных выражений можно задать шаблоны, позволяющие:
найти все последовательности символов «кот» в любом контексте, как то: «кот», «котлета», «терракотовый»;
найти отдельно стоящее слово «кот» и заменить его на «кошка»;
найти слово «кот», которому предшествует слово «персидский» или «чеширский»;
убрать из текста все предложения, в которых упоминается слово кот или кошка.
Последнее предложение мне не нравится, кто-нибудь может отредактировать эту страницу?
В Java могут использоваться нестандартные приёмы использования регулярных выражений по синтаксису. Например, во многих языках выражение \\ означает, что ищется символ обратного слеша, который идёт за специальным мета-символом регулярного выражения. В Java придётся использовать для этой цели \\\\. Но таких различий немного.
Пакет содержит два класса — Pattern и Matcher, которые работают вместе. Класс Patern применяется для задания регулярного выражения. Класс Matcher сопоставляет шаблон с последовательностью символов.
Регулярное выражение состоит из обычных символов, наборов символов и групповых символов. Обычные символы используются как есть. Если в шаблоне указать символы «кот», то эти символы и будут искаться в строке.
Символы новой строки, табуляции и др. определяются при помощи стандартных управляющих последовательностей, которые начинаются с обратного слеша (\). Например, символ новой строки можно задать как \n.
Наборы символов заключаются в квадратные скобки. Например, [cat] совпадает с символами c, a, t. Если поставить символ ^ перед набором символов — [^cat], то ищутся совпадения всех символов, кроме c, a, t.
Чтобы задать диапазон символов, используется дефис. Например, диапазон от 1 до 9 можно задать как [1-9].
Символ точки является групповым символом, который совпадает с любым символом вообще.
Также можно задать, сколько раз совпадает выражение.
- + — совпадает один или более раз
- * — совпадает нуль или более раз
- ? — совпадает нуль или один раз
Например, выражение -?\\d+ будет искать число, у которого может быть минус (а может и нет).
Выражение c.t позволит найти слова cat, cot, но не cart.
Регулярные выражения встречаются в методах класса String.
System.out.println("-123".matches("-?\\d+")); // да System.out.println("123".matches("-?\\d+")); // да System.out.println("+123".matches("-?\\d+")); // нет System.out.println("+123".matches("(-|\\+)?\\d+")); // да
Первые два выражения подходят под составленное выражение — либо число с минусом, либо число без знака. Со знаком плюс число не проходит проверку. Чтобы и этот вариант проходил, нужно видоизменить выражение (четвёртый вариант).
Нужно включить условие «может начинаться с + или -» с помощью вертикальной черты | (ИЛИ). Круглые скобки используются для группировки. Знак вопроса позволяет указать, что допустимо отсутствие знака. Знак плюса экранируется, так как является мета-символом.
Если вы зададите неверное выражение, то будет создано исключение PatternSyntaxException.
Руководство по Java. Регулярные выражения Java.
Регулярные выражения – это специальные последовательности символов, которые помогают нам находить строки или множества строк, используя специальные синтаксические шаблоны.
Регулярные выражения в Java обеспечиваются пакетом java.util.regex.
В пакете java.util.regex ключевыми являются 3 класса:
- Matcher
Этот класс интерпретирует шаблон и определяет совпадения в водимой строке. - Pattern
Класс Pattern предоставляет нам скомпилированный вариант регулярного выражения. - PatternSyntaxException
Этот класс предоставляет нам непроверяемые исключения, которые указывают нам на синтаксическую ошибку в нашем регулярном выражении.
Схватывающая группа
Схватывающая группа – это способ представить несколько символов, как единый элемент. Они создаются путём размещения символов внутри множества скобок. Например, слово (car) создаёт единую группу, которая состоит из букв “c”, “a” и “r”.
Для того чтобы понять, как это применяется на практике, рассмотрим пример простого приложения.
import java.util.regex.Matcher; import java.util.regex.Pattern; public class CapturingGroupDemo < public static void main(String[] args) < String inputString = "This is simple that contains phone number +380505055050 That's great."; String pattern = "(\\d+)"; Pattern ptrn = Pattern.compile(pattern); Matcher matcher = ptrn.matcher(inputString); if(matcher.find())< System.out.println("Phone number: " + matcher.group(0)); >else < System.out.println("PHONE NUMBER NOT FOUND"); >> >
В результате работы программы мы получим такой результат:
/*Some system messages*/ Phone number: 380505055050
Здесь приведён крайне примитивный способ найти номер телефона в строке. На практике, для такой операции понадобиться более сложный шаблон, но в качестве примера нас устроит и такой вариант.
Как мы видим, мы применяем регулярное выражение \d, которое выводит числа (от 0 до 9). В результате программа опускает все нечисловые символы в строке и возвращает нам только номер телефона.
Ниже приведён список символов, которые мы можем использовать для регулярных выражений в языке программирования Java.
^ | Совпадает начало строки |
$ | Совпадает конец строки |
. | Совпадают все символы, кроме символа новой строки. |
[…] | Совпадает любой отдельный символ в скобках. |
[^…] | Совпадает любой отдельный символ не в скобках. |
\A | Начало всей строки |
\z | Конец всей строки |
\Z | Конец всей строки, за исключением допустимого конечного конца строки. |
re* | Совпадает 0 или более вхождений предыдущего выражения. |
re+ | Совпадает 1 или более из предыдущих вещей. |
re? | Совпадает 0 или 1 вхождений предыдущего выражения. |
re | Совпадает n вхождений предыдущего выражения. |
re | Совпадает n или более вхождений предыдущего выражения. |
re | Совпадает от n до m вхождений предыдущего выражения. |
a| b | Совпадает a или b. |
(re) | Группирует регулярные выражения и запоминает совпадающий текст. |
(?: re) | Группирует регулярные выражения без запоминания совпадающего текста. |
(?> re) | Совпадает независимый шаблон без возвратов. |
\w | Совпадает символ в слове. |
\W | Совпадает символ не в слове. |
\s | Совпадают пробелы. |
\S | Совпадают не пробелы. |
\d | Совпадают числа. |
\D | Совпадают не числа. |
\G | Соответствует точке, где заканчивается предыдущее совпадение. |
\n | Обратная ссылка для захвата числа n. |
\b | Совпадают границы слова за пределами скобок. |
\B | Совпадают границы не слова. |
\n, \t, etc. | Совпадают соответствующие символы (новая строка, возврат каретки и т.д.) |
\Q | Цитаты, до символа \Е |
\E | Конец цитаты \Q |
Методы класса Matcher
В классе Matcher есть ряд методов, для определения места совпадения.
- public int start()
Возвращает начальный индекс предыдущего совпадения. - public int start(int group)
Возвращает начальный индекс подстроки, захваченной данной группой во время предыдущего совпадения. - public int end()
Возвращает смещение после крайнего совпадающего символа. - public int end(int group)
Возвращает смещение после крайнего символа подстроки, захваченного данной группой во время крайнего совпадения.
Методы поиска
Методы поиска предназначены для того, чтобы узнать есть ли во вводимой строке указанный шаблон (pattern).
Вот список методов поиска:
- public boolean lookingAt()
Ищет совпадения вводной строки и шаблона. - public boolean find()
Ищет подстроку вводной строки, которая совпадает с шаблоном. - public boolean find(int start)
Ищет подстроку вводной строки, которая совпадает с шаблоном начиная с указанного индекса. - public boolean matches()
Ищет совпадения всей строки и шаблона.
Методы замещения
Для замещения текста во вводной строке в языке Java предусмотрены следующие методы:
- public Matcher appendReplacement(StringBuffer sb, String replacement)
Метод реализует объединение и замену строки. - public StringBuffer appendTail(StringBuffer sb)
Метод реализует объединение и замену строки. - public String replaceAll(String replacement)
Заменяет все подстроки вводной строки, которая совпадает с шаблоном, указанным во вводной строке. - public String replaceFirst(String replacement)
Заменяет первую подстроку вводной строки, которая совпадает с шаблоном. - public static String quoteReplacement(String s)
Этот метод возвращает литеральную замену стоки для указанной строки.
Для понимания того, как все эти методы работают на практике, рассмотрим примеры простых приложений.
Метод find()
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexFindMethodDemo < public static void main(String[] args) < String regularExpression = "\\bjava\\b"; String inputString = "java java java2ee java"; Pattern pattern = Pattern.compile(regularExpression); Matcher match = pattern.matcher(inputString); int matchCounter = 0; System.out.println("Now we will use method find(). "); while (match.find())< matchCounter++; System.out.println("start(): " + match.start()); System.out.println("end(): " + match.end()); System.out.println("Number of match: " + matchCounter); >> >
В результате работы программы мы получим следующий результат:
/*Some system messages*/ Now we will use method find(). start(): 0 end(): 4 Number of match: 1 start(): 5 end(): 9 Number of match: 2 start(): 18 end(): 22 Number of match: 3
Метод lookingAt()
Пример:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexLookingAtMethodDemo < public static void main(String[] args) < String regularExpression = "Java"; String inputString = "Java Developer"; Pattern pattern; Matcher match; pattern = Pattern.compile(regularExpression); match = pattern.matcher(inputString); System.out.println("Input string: " + inputString); System.out.println("Regular expression: " + regularExpression); System.out.println("Using method lookingAt(): " + match.lookingAt()); System.out.println("Matches: " + match.matches()); >>
В результате работы программы мы получим следующий результат:
/*Some system messages*/ Input string: Java Developer Regular expression: Java Using method lookingAt(): true Matches: false
Метод replaceAll()
Пример:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class ReplaceFirstMethodDemo < public static void main(String[] args) < String regularExpression = "C#"; String inputString = "C# is the most popular programming language in the world. You should learn C#."; String realSituation = "Java"; Pattern pattern = Pattern.compile(regularExpression); Matcher match = pattern.matcher(inputString); System.out.println("Some people say:"); System.out.println(inputString); inputString = match.replaceAll(realSituation); System.out.println("But frankly speaking:"); System.out.println(inputString); >>
В результате работы программы мы получим следующий результат:
/*Some system messages*/ Some people say: C# is the most popular programming language in the world. You should learn C#. But frankly speaking: Java is the most popular programming language in the world. You should learn Java.
Метод appendReplacement()
Пример:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class AppendReplacementMethodDemo < public static void main(String[] args) < String regularExpression = "bla"; String inputString = "blablablaReallyblablablaImportantblablaInformationblabla"; String replace = " "; System.out.println("Initial input string:"); System.out.println(inputString); Pattern pattern = Pattern.compile(regularExpression); Matcher match = pattern.matcher(inputString); StringBuffer stringBuffer = new StringBuffer(); while (match.find())< match.appendReplacement(stringBuffer, replace); >match.appendTail(stringBuffer); System.out.println("Final input string:"); System.out.println(stringBuffer.toString()); > >
В результате работы программы мы получим следующий результат:
/*Some system messages*/ Initial input string: blablablaReallyblablablaImportantblablaInformationblabla Final input string: Really Important Information
В этом уроке мы изучили что такое регулярные выражения и основные методы, которые используются при работе с ними. Мы также рассмотрели примеры простых приложений с практическим применением регулярных выражений.
В следующем уроке мы более глубоко изучим, что такое методы и как они работают в языке программирования Java.
Полезности
Туториалы
Системный дизайн
Собеседования
Студенты
Задачи
Немного о себе
Приветствую! Меня зовут Евгений. На этом сайте я пишу о разработке программного обеспечения. Связаться со мной вы можете по email: proselytear@yahoo.com Имеет смысл, предварительно ознакомиться вот с этим FAQ разделом.
Недавние публикации
- Механизмы CAS и FAA глазами Java разработчика
- ExecutorService в Java и примеры его применения.
- Особенности работы PreparedStatement в JDBC
- Основы кэширования в Hibernate
- Феномены чтения глазами разработчика
Copyright © 2023 PROSELYTE.
Omega WordPress Theme by ThemeHall