Регулярные выражения в java с регулярными выражениями
Регулярное выражение — это строка символов, описывающая шаблон в последовательности символов. Вы можете использовать API регулярное выражение for:
Пример:
Example
Example
Examples
Группы catch подсчитываются по количеству скобок, открывающихся слева направо. В выражении (A(B(C))), есть 4 группы. Группа 0 всегда содержит полное выражение:
Подстрока, захваченная группой, возвращается group(int).
Пример 1:
Эта программа создает регулярное выражение, которое считывает и проверяет действительность телефонного номера:
Examples
Java Doc: Регулярные выражения
JavaPoint: Java Regex
TutorialsPoint: Java - Регулярные выражения
Expand: Регулярные выражения с помощью Java
- Проверить последовательность символов, например, проверить действительность адреса электронной почты или пароля;
- Поиск в a струна;
- Замена шаблона или набора символов в String.
API java.util.regex имеет единый интерфейс и три класса:
- Pattern class: скомпилированное представление регулярного выражения. Чтобы создать шаблон, необходимо вызвать один из его методов публичная статическая компиляция, который вернет объект Pattern. Эти методы принимают регулярные выражения в качестве аргумента.
- Matcher class: поисковая система шаблонов, которая анализирует строку. Объект Matcher можно получить, вызвав метод Matcher в объекте Pattern. Эти два класса работают вместе.
- PatternSyntaxException: выбрасывает исключение, когда регулярное выражение недопустимо.
Matcher class
Методы класса Matcher:
No. | Method | Description |
---|---|---|
1 | boolean matches() | возвращает true, если строка проверяет шаблон |
2 | boolean find() | < td class="tg-031e">найти следующее выражение, которое проверяет шаблон|
3 | boolean find(int start) | найти следующее выражение, которое проверяет шаблон из начального индекса |
Pattern class
Это скомпилированная версия регулярного выражения. Используется для шаблона или регулярного выражения.
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;The matches()принадлежит классу Matcher и Pattern, возвращает true если искомый шаблон существует в строке.
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 (Незашифрованный и появляется хотя бы один раз)
}
}
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 | tr>
[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 | tr>
[0-9]{4} | Ошибка 2038 года похожа на ошибку 2000 года | {2038}, {2000} |
4- Группы захвата
Группы захвата дают возможность обрабатывать несколько символов как единое целое или подшаблон. Например, (abc) создает одну группу, содержащую символы "a", "b" и "c".Группы catch подсчитываются по количеству скобок, открывающихся слева направо. В выражении (A(B(C))), есть 4 группы. Группа 0 всегда содержит полное выражение:
- Группа 0: (A(B(C)))
- Группа 1: (A)
- Группа 2: (B(C))
- Группа 3: (C)
Подстрока, захваченная группой, возвращается 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:ABCExample 2
group 1:ABC
group 2:BC
group 3:C
Эта программа создает регулярное выражение, которое считывает и проверяет действительность телефонного номера:
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 | Конец последовательности | tr>
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): Перебирает и заменяет все вхождения.
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