Регулярные выражения в java с регулярными выражениями

Регулярное выражение — это строка символов, описывающая шаблон в последовательности символов. Вы можете использовать API  регулярное выражение  for:
  • Проверить последовательность символов, например, проверить действительность адреса электронной почты или пароля;
  • Поиск в a  струна;
  • Замена шаблона или набора символов в String.
API java.util.regex имеет единый интерфейс и три класса:
  • Pattern class: скомпилированное представление регулярного выражения. Чтобы создать шаблон, необходимо вызвать один из его методов публичная статическая компиляция,  который вернет объект Pattern. Эти методы принимают регулярные выражения в качестве аргумента.
  • Matcher class: поисковая система шаблонов, которая анализирует строку. Объект Matcher можно получить, вызвав метод Matcher в объекте Pattern. Эти два класса работают вместе.
  • PatternSyntaxException: выбрасывает исключение, когда регулярное выражение недопустимо.

Matcher class

Методы класса Matcher:

< td class="tg-031e">найти следующее выражение, которое проверяет шаблон
No. Method Description
1 boolean matches() возвращает true, если строка проверяет шаблон
2 boolean find()
3 boolean find(int start) найти следующее выражение, которое проверяет шаблон из начального индекса

Pattern class

Это скомпилированная версия регулярного выражения. Используется для шаблона или регулярного выражения.

< td class="tg-031e">4
No. Method Description
1 static Pattern compile(String regex) компилирует регулярное выражение и возвращает экземпляр Pattern
2 Matcher matcher( CharSequence input) создает сопоставитель, который анализирует входную последовательность
3 static boolean matches(String regex, CharSequence input) компилирует и анализирует входную последовательность.
String[] split(CharSequence c) возвращает массив подстрок, начинающихся с символа c
5 String pattern() возвращает строку регулярного выражения

Example

import java.util.regex.*; 

public class regexTest {

public static void main(String args[]) {
Pattern p;
Matcher m;
//компиляция регулярного выражения с шаблоном: "a"
p = Pattern.compile("a");
//создадим и свяжем движок с регулярным выражением по строке "ab"
m = p.matcher("ab");
//если паттерн найден
if(m.find()) {
System.out.println("паттерн найден");
}
}
}
pattern found

Синтаксис регулярного выражения

1- Мета-символы

Мета-символы - это символы со значением или каким-либо другим образом, Как построен паттерн. Например, если перед мета-символом стоит символ , он не будет интерпретирован синтаксическим анализатором. Метасимволы, поддерживаемые регулярными выражениями java, приведены в следующей таблице:

Character Description
[ ] определяет набор символов в
{ } Quantizer
\ символ не считается metacharacter
^ Начало строки
$ Endline
| оператор OU
? 0 или один раз предыдущее выражение
* 0 или более одного раза предыдущее выражение
+ один или несколько раз предыдущее выражение
. Заменяет любой символ

Пример:

import java.util.regex.Matcher; 
import java.util.regex.Pattern;

public class metaCharactersExample: {

public static void main(String[] args) {
System.out.println(
Pattern.matches(".c", "abc"));//false (. только заменяет a)
System.out.println(
Pattern.matches(".. c", "abc"));//true (3-й символ - c)
System.out.println(
Pattern.matches("... c", "abbc"));//true (4-й символ c)

System.out.println(Pattern.matches("\\d", "2"));//true (только одна цифра)
System.out.println(Pattern.matches("\\d", "332"));//false (несколько цифр)
System.out.println(Pattern.matches(
"\\d","123abc"));//false (цифры и символы)

System.out.println(Pattern.matches(
"\\D*", "geek"));//true (Незашифрованный и появляется хотя бы один раз)
}
}
The matches()принадлежит классу Matcher и Pattern, возвращает true если искомый шаблон существует в строке.

2- Классы символов

Класс символов представляет собой набор символов. Метасимволы [...] означает класс символов в регулярном выражении. Диапазон можно определить с помощью дефиса '-'. Например[0-9] представляет цифры от 0 до 9.

[abc] a, b или c
[^abc] Отрицание: Заменяет весь алфавит, кроме a,b и c
[a-zA-Z] Диапазон: Заменяет все символы от a до z и от A до Z
[a-d[m-p]] Union: Заменяет символы от a до d или от m до p: [a-dm-p]
[a-z& & [азбука]] Intersection: Заменяет все пересечение a, b и c символами от a до z
[a-z& & [^cd]] Вычитание: Заменяет все символы от a до z, кроме c и d: [abe-z]
[a-z& & [^м-]] Вычитание: от a до z, кроме m до p: [a-lq-z]

Example

import java.util.regex.Matcher; 
import java.util.regex.Pattern;

public class metaFeaturesExample: {

public static void main(String[] args) {
Шаблон p;
Matcher m;
//все цифры от 0 до 9, кроме 345
p = Pattern.compile("[0-9& & [^345]]");
m = p.matcher("7");
логическое значение b = m.matches();
System.out.println(b);
}
}
true

Предопределенные классы символов

Это классы, уже определенные в API Java:

Class Description
. Любой символ
\d Одно число: [0-9]
\D Любой символ, кроме цифр [^0-9]
\s Пустой символ: разрыв строки, пробел: [ \t\n\x0B\f\r]
\S Небелый символ: [^\s]
\w Символ слова: [a-zA-Z_0-9]
\W Символ, который не является словом: [^\w]

Example

import java.util.regex.Matcher; 
import java.util.regex.Pattern;

public class CharacterClassesExample{
public static void main(String args[]) {
//d: одна цифра
//+: 1 или более цифр
Строковое регулярное выражение = "\\d+";
Шаблон p = Pattern.compile(регулярное выражение);

Строковая фраза = "2015 год 21";

Matcher m = p.matcher(предложение);

if (m.find()) {
//показать первую группу
System.out.println("group 0:" + m.group(0));
}
}
}
group 0:2015
В этом примере регулярное выражение "\\d+" содержит две косые черты, потому что в Java вы всегда добавляете '\ раньше. \d означает диапазон от 0 до 9 Если удалить '+ будет учитываться только первая найденная цифра: 2.

3-  Квантификаторы

Квантователи позволяют задать количество повторений символа.

Квантователи Description
X? X встречается не более одного раза
X+ Один или несколько раз
X* ноль или несколько раз
X{n} n раз
X{n, } n или несколько раз
X{y,z} по крайней мере y раз, но меньше z раз

Examples

Motif String Результаты
[abc]? a a
[abc]? aa none
[abc]? ab none
a? abdaaaba {a}, { },{ },{a},{a},{a},{ },{a}
a* abdaaaba {a},{ },{ },{ },{a},{a}
a+ abdaaaba {a}, {aaa},{a}
a[3] aaaa aaa
a{3, 6} aaaaaa aaaaaa
[0-9]{4} Ошибка 2038 года похожа на ошибку 2000 года {2038}, {2000}

4- Группы захвата

Группы захвата дают возможность обрабатывать несколько символов как единое целое или подшаблон. Например, (abc) создает одну группу, содержащую символы "a", "b" и "c".

Группы catch подсчитываются по количеству скобок, открывающихся слева направо. В выражении (A(B(C))), есть 4 группы. Группа 0 всегда содержит полное выражение:
  1. Группа 0: (A(B(C)))
  2. Группа 1:  (A)
  3. Группа 2:  (B(C))
  4. Группа 3:  (C)
Чтобы узнать в Java, сколько групп в выражении, вызовите метод groupCount() объекта Matcher. Метод groupCount() возвращает int который представляет общее количество групп. В следующем примере goupCount() вернет число 4.

Подстрока, захваченная группой, возвращается group(int).

Пример 1:

import java.util.regex.Matcher; 
import java.util.regex.Pattern;

public class Goup {

public static void main(String[] args) {

Pattern p = Pattern.compile("(A(B(C)))");
Matcher m = p.matcher("ABC");
if( m.matches())
for(int i= 0; i<= m.groupCount(); ++i)
System.out.println("group "+i+" :"+m.group(i));

}
}
group 0:ABC
group 1:ABC
group 2:BC
group 3:C
Example 2

Эта программа создает регулярное выражение, которое считывает и проверяет действительность телефонного номера:

import java.util.regex.Matcher; 
import java.util.regex.Pattern;

public class regex_telephone {

public static void main(String[] args) {

String regex = "\\b(\\d{3})(\\d{4})(\\d{3})(\\d{3})\\b";
Шаблон p = Pattern.compile(регулярное выражение);
Строка tel = "2541724156348";

Matcher m = p.matcher(tel);

if (m.find()) {
System.out.println("Phone: ("
+ m.group(1) + ") " + m.group(2) + "-"
+ m.group(3) + "-" + m.group(4));
}
}
}
Телефон: (254) 1724-156-348

5- Поиск границ

Вы можете сделать свой шаблон более точным, указав местоположение паттерна, который вы ищете, и где он начинается.

limiter Description
^ начало строки
$ Endline
\b Конец слова.
\B Non-Word End.
\A Начало последовательности ввода
\ G Конец предыдущего вхождения
\Z Конец последовательности, кроме последнего символа
\z Конец последовательности

Examples

Motif String Results
^java$ java java
\s*java$ java java
^hello\w* helloblahblah helloblahblah
\bjava\B JavaScript — это язык программирования java
\Gtest test test test
\btest\b это тест test

Найти шаблон и заменить его

API регулярных выражений дает возможность найти один текст и заменить его другим. В Java для выполнения этой задачи можно использовать два метода класса Matcher:
  • replaceFirst(String): заменяет только первое вхождение;
  • replaceAll(String): Перебирает и заменяет все вхождения.
Example:

import java.util.regex.Matcher; 
import java.util.regex.Pattern;

public class Замена {
public static void main(String[] args) {
Pattern p = Pattern.compile("bus");
Matcher m = p.matcher("Я еду на автобусе");
Строка s = m.replaceAll("train");
System.out.println(s);
}
}
Я еду на поезде
References:
Java Doc:  Регулярные выражения
JavaPoint:   Java Regex
TutorialsPoint:  Java - Регулярные выражения
Expand:  Регулярные выражения с помощью Java