Технологии программирования
Регулярные выражения
Можно тренироваться в придумывании и использовании регулярных выражений на сайте regexr.com.
Регулярное выражение — это описание множества слов, где слова это последовательности символов. Т.е. фактически регулярное выражение описывает подмножество значений типа String.
Примеры множеств слов:
- Все строки длины 2
- Все строки, начинаются и заканчиваются на букву a
- Все строки, пример, похожи на email L = {“abc@yandex.ru”, “ivanetsas@gmail.ru”}
- Что-то похожее на даты
- именя
- числа
Зачем. Можно
- Проверить, соответствует ли строка регулярному выражению. Например, вы можете проверить email, введенный пользователем, похож ли он вообще на email.
- Искать вхождения внутри текста. Например, искать внутри длинного текста строки, похожие на email.
- Искать и заменять. Например, находить имена внутри текста, заменять их на ***. Это может быть нужно для анонимизации.
Пример:
- “ss” - одно слово ss
-
“ss aa” - либо слово ss либо aa -
”s(s a)” - либо слово ss либо sa -
“(s a)(d f)” - либо слово sd, sf, ad, af -
0 1 2 … 9 - 10 вариантов любой цифры - \d - любая цифра
- s* - звездочка означает что может 0 и более символов
- s+ - плюсик что может быть 1 и более символов
- [asdf] - только одна буква из набора
- [asdf]* - только одна буква из набора
- [a-zA-Z] - одна любая английская буква
- [a-z]+@[a-z]+.[a-z]{2,3} - такой пример для email
. - любой символ
-
- один и более
-
- ноль и более {2,3} - повторение от 2 до 3 раз \s - пробельный символ
// прикреплю ссылку на доку
Регулярки в Java
Есть несколько методов в классе String, которые принимают регулярные выражения в качестве аргументов
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Temp {
public static void main(String[] args) {
boolean isMatch = "abc".matches("[a-z]+"); // true
String replacedString = "abc123df".replaceAll("\\d", "++"); // "\\d"
String replaceFirstString = "abc123df".replaceFirst("\\d", "++");
String[] array = "abc_sdf_dfg".split("_"); // ["abc", "sdf", "dfg"]
Pattern p = Pattern.compile(
"(\\d+) КОТ(|А|ОВ)",
Pattern.MULTILINE + Pattern.UNICODE_CHARACTER_CLASS
);
/**
* FLAGS:
* CASE_INSENSITIVE - игнорировать регистр
* UNICODE_CHARACTER_CLASS - поддержка юникода
* DOTALL - точка будет обозначать любой символ включая перевод строки (без него - любой символ кроме перевода
* строки)
* MULTILINE - ^ - начало строки, $ - дополнительно обозначает конец строки
* */
Matcher m1 = p.matcher("42 кота"); // связываем нашу регулярку с конкретной строкой
if (m1.matches()) {
System.out.println("Ура мы нашли котов!");
System.out.println("Сопоставилось:" + m1.group());
System.out.println("Количество найденных котов:" + m1.group(1));
}
Matcher m2 = p.matcher("1 кот, 2 кота, 3 кота");
while (m2.find()) {
System.out.println("Найдены коты");
System.out.println("Сопоставилось:" + m1.group());
System.out.println("Количество найденных котов:" + m1.group(1));
}
// appendReplacement
}
}