Слайд 2
Определение
Формальный язык поиска и осуществления манипуляций с подстроками
в тексте.
Основан на использовании метасимволов.
Kolesnikov D.O. SED KNURE
Слайд 3
Символы
x ==> символ x
\\ ==> обратный слеш
\xhh ==> символ с кодом U+00hh
\xhhhh ==> символ с кодом
U+hhhh
\n ==> перевод строки
\r ==> возврат каретки
\t ==> табуляция
Kolesnikov D.O. SED KNURE
Слайд 4
Символьные классы
Простой класс:
[abc] ==> a, b или c
Регулярное выражение: [ab]
Входная
строка: accddba
Kolesnikov D.O. SED KNURE
Слайд 5
Символьные классы
Отрицание:
[^abc] ==> любой символ, кроме a, b, c
Регулярное выражение:
[^ab]
Входная строка: acdba
Kolesnikov D.O. SED KNURE
Слайд 6
Символьные классы
Диапазон:
[a-zA-Z] ==> от a до z или от A
до Z
Регулярное выражение: [a-cA-Z]
Входная строка: adAcdh
Kolesnikov D.O. SED KNURE
Слайд 7
Символьные классы
Объединение:
[a-z[A-Z]] ==> от a до z или от A
до Z
Тоже самое, что и [a-zA-Z]
Kolesnikov D.O. SED KNURE
Слайд 8
Символьные классы
Пересечение:
[a-z&&[def]] ==> d, e или f
Регулярное выражение: [a-d&&c-f]
Входная строка:
accdddeab
Kolesnikov D.O. SED KNURE
Слайд 9
Символьные классы
Вычитание:
[a-z&&[^def]] ==> от a до c или от g
до z
Регулярное выражение: [a-d&&[^c-f]]
Входная строка: accdddeab
Kolesnikov D.O. SED KNURE
Слайд 10
Символьные классы Java
Эквиваленты методов класса Character:
\p{javaLowerCase} ~ isLowerCase
\p{javaUpperCase} ~ isUpperCase
\p{javaWhitespace} ~ isWhitespace
Регулярное выражение:
\p{javaUpperCase} \p{javaLowerCase}
Входная
строка: Текст
Kolesnikov D.O. SED KNURE
Слайд 11
Предопределенные классы
. ==> любой символ
Регулярное выражение: ...
Входная строка: abcdefgh
Регулярное выражение:
..
Входная строка: abcde
Kolesnikov D.O. SED KNURE
Слайд 12
Предопределенные классы
\d ==> цифра, [0-9]
\D ==> не цифра, [^\d]
Регулярное выражение: \d\D
Входная строка:
ab8ab8
Kolesnikov D.O. SED KNURE
Слайд 13
Предопределенные классы
\s ==> пробельный символ, [ \t\n\f\r\x0b]
\S ==> непробельный символ, [^\s]
Регулярное выражение:
\s\S
Входная строка: ab 8 ab8
Kolesnikov D.O. SED KNURE
Слайд 14
Предопределенные классы
\w ==> символ слова, [a-zA-Z_\d]
\W ==> отрицание \w, [^\w]
Регулярное выражение: \w\W
Входная
строка: ab*8&ab8
Kolesnikov D.O. SED KNURE
Слайд 15
Границы
^ ==> начало строки
Регулярное выражение: ^ab
Входная строка: ababab
$ ==> конец строки
Регулярное выражение:
ab$
Входная строка: ababab
Kolesnikov D.O. SED KNURE
Слайд 16
Границы
\b ==> граница слова
\B ==> отрицание \b
Регулярное выражение: abc\b
Входная строка: abc abcd
Kolesnikov
D.O. SED KNURE
Слайд 17
Границы
\A ==> начало ввода
Регулярное выражение: \Aabc
Входная строка:
abc abc
abc abc
Kolesnikov D.O.
SED KNURE
Слайд 18
Границы
\z ==> конец ввода
Регулярное выражение: abc\z
Входная строка:
abc abc
abc abc
Kolesnikov D.O.
SED KNURE
Слайд 19
Границы
\Z ==> конец ввода, как и \z, но может включать
ограничитель строки
Регулярное выражение: abc\Z
Входная строка:
abc abc
abc abc
Kolesnikov D.O.
SED KNURE
Слайд 20
Ограничители строк
'\n' ==> LF (новая строка)
'\r' ==> CR (возврат каретки)
"\r\n" ==> CR+LF
'\u0085' ==> следующая строка
'\u2028' ==> разделитель строки
'\u2029' ==> разделитель
параграфа
Kolesnikov D.O. SED KNURE
Слайд 21
Квантификаторы
Квантификатор определяет повторяемость.
Жадный квантификатор определяет максимально возможную подстроку.
Ленивый
квантификатор определяет минимально возможную подстроку.
Kolesnikov D.O. SED KNURE
Слайд 22
Квантификаторы
X? ==> один или ноль раз (жадный)
Регулярное выражение: ab?
Входная строка:
aabcabbb
X?? ==> один или ноль раз (ленивый)
Регулярное выражение: ab??
Входная строка: aabcabbb
Kolesnikov
D.O. SED KNURE
Слайд 23
Квантификаторы
X* ==> ноль или более раз (жадный)
Регулярное выражение: ab*
Входная строка:
aabcabbb
X*? ==> ноль или более раз (ленивый)
Регулярное выражение: ab*?
Входная строка: aabcabbb
Kolesnikov
D.O. SED KNURE
Слайд 24
Квантификаторы
X+ ==> один или более раз (жадный)
Регулярное выражение: ab+
Входная строка:
aabcabbb
X+? ==> один или более раз (ленивый)
Регулярное выражение: ab+?
Входная строка: aabcabbb
Kolesnikov
D.O. SED KNURE
Слайд 25
Квантификаторы
X{n} ==> ровно n раз (жадный)
или (совпадает по результату применения)
X{n}? ==> ровно
n раз (ленивый)
Регулярное выражение: ab{2} или ab{2}?
Входная строка: aabcabbb
Kolesnikov
D.O. SED KNURE
Слайд 26
Квантификаторы
X{n,} ==> не менее n раз (жадный)
Регулярное выражение: ab{2,}
Входная строка:
aabcabbb
X{n,}? ==> не менее n раз (ленивый)
Регулярное выражение: ab{2,}?
Входная строка: aabcabbb
Kolesnikov
D.O. SED KNURE
Слайд 27
Квантификаторы
X{n,m} ==> от n до m раз (жадный)
Регулярное выражение: ab{1,2}
Входная
строка: aabcabbb
X{n,m}? ==> от n до m раз (ленивый)
Регулярное выражение: ab{1,2}?
Входная
строка: aabcabbb
Kolesnikov D.O. SED KNURE
Слайд 28
Сверхжадные квантификаторы
При поиске в строке aab с помощью
рег. выражения a+b шаги анализатора:
a+ ==> a (соответствует)
a+ ==> aa (соответствует)
a+ ==> aab (не соответствует)
откат назад (возврат
b) к последнему соответствию (aa) и проверка a+b:
a+b ==> aab (соответствует)
Kolesnikov D.O. SED KNURE
Слайд 29
Сверхжадные квантификаторы
Сверхжадный квантификатор действует как жадный, но никогда
не откатывается назад.
a++ ==> a (соответствует)
a++ ==> aa (соответствует)
a++ ==> aab (не соответствует)
Последний символ ввода (b) прочтен,
соответствие не найдено.
Kolesnikov D.O. SED KNURE
Слайд 30
Сверхжадные квантификаторы
Чтобы сделать жадный квантификатор сверхжадным достаточно добавить
+ справа от квантификатора:
X? ==> X?+ X{n} ==> X{n}+
X* ==> X*+ X{n,} ==> X{n,}+
X+ ==> X++ X{n,m} ==> X{n,m}+
Сверхжадные квантификаторы работают как правило быстрее,
чем жадные.
Kolesnikov D.O. SED KNURE
Слайд 31
Логические операции
XY ==> X за которым следует Y (AND)
X|Y ==> X илиY
(OR)
Приоритет AND выше чем OR.
Регулярное выражение: aa|b
Входная строка: aabcabbb
Kolesnikov
D.O. SED KNURE
Слайд 32
Группы
Выражение в круглых скобка - группа.
Каждая группа имеет
номер.
Группы нумеруются слева направо, начиная с единицы (номер может
быть больше 9)
Чтобы группа не нумеровалась, она должна начинаться с (?:
Kolesnikov D.O. SED KNURE
Слайд 33
Группы
(A)(B(C)(?:D))
(A) ==> группа номер 1
(B(C)(?:D)) ==> группа номер 2
(C) ==> группа номер 3
(?:D) ==> группа без
номера
Kolesnikov D.O. SED KNURE
Слайд 34
Группы
Группы могут быть использованы по номеру в регулярном
выражении с помощью синтаксиса: \НОМЕР_ГРУППЫ
Регулярное выражение: (aab)\W\1
Входная строка: aab
aab
Kolesnikov D.O. SED KNURE
Слайд 35
Экранирование символов
Для представления специальных символов:
\ .
| + * ?
[ ]
( ) { }
^ $
используют экранирование с помощью обратного слеша:
\\ \. \\ \+ \* \?
\[ \] \( \) \{ \}
\^ \$
Kolesnikov D.O. SED KNURE
Слайд 36
Экранирование символов
Для указания диапазона экранирования можно использовать \Q
и/или \E
\Q ==> начало диапазона
\E ==> окончание диапазона
Регулярное выражение: \Q\(*\E(a)\1
Входная строка: ab\(*aa
Kolesnikov D.O.
SED KNURE
Слайд 37
Упреждающий просмотр вперед
Позитивный: (?=X)
Регулярное выражение: a(?=b)
Входная строка: abacab
Негативный:
(?!X)
Регулярное выражение: a(?!b)
Входная строка: abacab
Kolesnikov D.O. SED KNURE
Слайд 38
Просмотр назад
Позитивный: (?
выражение: (?Входная строка: abacab
Kolesnikov D.O. SED KNURE
Слайд 39
Режимы
Влияют на работу регулярных выражений.
Каждый режим имеет буквенный
код.
COMMENTS ==> x
CASE_INSENSITIVE ==> i
UNIX_LINES ==> d
DOTALL ==> s
UNICODE_CASE ==> u
MULTILINE ==> m
Kolesnikov D.O. SED KNURE
Слайд 40
Режимы
Чтобы включить режим, достаточно предварить регулярное выражение комбинацией:
(?КОД_РЕЖИМА).
(?m) (?s)
Если нужно включить сразу несколько режимов, можно писать несколько
кодов:
(?iu)
Kolesnikov D.O. SED KNURE
Слайд 41
Режимы
COMMENTS ==> x
Режим комментариев. Пробельные символы игнорируются, после символа #
можно писать комментарий к рег. выражению.
Регулярное выражение: (?x)a
bc #comment
Входная строка: abcab
Kolesnikov D.O. SED KNURE
Слайд 42
Режимы
CASE_INSENSITIVE ==> i
Игнорирует регистр символов.
UNIX_LINES ==> d
Разделитель строк только CR
(\r)
DOTALL ==> s
Точка (.) может включать \n
Kolesnikov D.O. SED KNURE