Максим Ширшин — Регулярные выражения
Transcript of Максим Ширшин — Регулярные выражения
![Page 1: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/1.jpg)
Школа Разработки Интерфейсов Яндекса
Руководитель Службы разработки интерфейсов Рекламных Технологий
Макс Ширшин
Регулярные выражения
![Page 2: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/2.jpg)
Вместо предисловия
2
![Page 3: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/3.jpg)
Виды регулярных выражений
• POSIX (BRE, ERE)
• PCRE = Perl-Compatible Regular Expressions
3
Цитата из стандарта языка JavaScript:
«Вид и функциональность регулярных выражений в JavaScript реализованы по подобию подсистемы регулярных выражений в языке программирования Perl 5»
![Page 4: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/4.jpg)
4
JS-синтаксис (очень кратко)
var re = /^foo/; // boolean re.test('строка'); // null или Array re.exec('строка');
![Page 5: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/5.jpg)
5
Из чего состоят регэкспы
1. Символы
— обычные
— специальные (метасимволы)
2. Операции
— квантификация
— перечисление
— группировка
![Page 6: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/6.jpg)
Метасимволы
6
![Page 7: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/7.jpg)
/./.test('foo'); // true /./.test('\r\n') // false Что вы хотели на самом деле: /[\s\S]/ для JS или /./s (не работает в JS)
7
Любой символ
![Page 8: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/8.jpg)
>>> /^something$/.test('something') true >>> /^something$/.test('something\nbad') false >>> /^something$/m.test('something\nbad') true
8
Границы строк
![Page 9: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/9.jpg)
>>> /\ba/.test('alabama) true >>> /a\b/.test('alabama') true >>> /a\b/.test('naïve') true не-граница слова /\Ba/.test('alabama');
9
Граница слова
![Page 10: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/10.jpg)
Символьные классы
10
![Page 11: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/11.jpg)
/\s/ (инвертированный вариант /\S/) FF 12: \t \n \v \f \r \u0020 \u00a0 \u1680 \u180e \u2000 \u2001 \u2002 \u2003 \u2004 \u2005 \u2006 \u2007 \u2008 \u2009 \u200a\ u2028 \u2029\ u202f \u205f \u3000 Chrome 19, IE 9: как в FF 12 и ещё \ufeff IE 7, 8 :-( только: \t \n \v \f \r \u0020
11
Пробельные символы
![Page 12: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/12.jpg)
/\d/ ~ цифры от 0 до 9 /\w/ ~ буквы, цифры и подчёркивание В JS не работает для русских букв! И наоборот: /\D/ ~ всё, кроме цифр /\W/ ~ всё, кроме букв и цифр
12
Буквы и цифры
![Page 13: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/13.jpg)
Пример: /[abc123]/ Работают метасимволы и диапазоны: /[A-F\d]/ Можно указать несколько диапазонов: /[a-cG-M0-7]/ ВАЖНО: диапазоны берутся из Юникода. При работе с кириллическими диапазонами проверьте порядок символов в Юникоде!
13
Произвольные классы символов
![Page 14: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/14.jpg)
символ «точка» — просто точка! /[.]/.test('anything') // false символы: \ ] - /[\\\]-]/
14
Произвольные классы символов
![Page 15: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/15.jpg)
всё, кроме a, b, c: /[^abc]/ ^ как символ: /[abc^]/
15
Инвертированные символьные классы
![Page 16: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/16.jpg)
Квантификаторы
16
![Page 17: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/17.jpg)
/bo*/.test('b') // true /.*/.test('') // true /bo+/.test('b') // false
17
Ноль или более, один или более
![Page 18: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/18.jpg)
/colou?r/.test('color'); /colou?r/.test('colour');
18
Ноль или один
![Page 19: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/19.jpg)
19
Диапазоны повторов
/bo{7}/ точно 7 /bo{2,5}/ от 2 до 5, x < y /bo{5,}/ 5 или более в JS не работает! /b{,5}/.test('bbbbb')
![Page 20: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/20.jpg)
var r = /a+/.exec('aaaaa'); >>> r[0] "aaaaa"
20
Жадные (greedy) квантификаторы
![Page 21: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/21.jpg)
var r = /a+?/.exec('aaaaa'); >>> r[0] "a" r = /a*?/.exec('aaaaa'); >>> r[0] ""
21
Ленивые (lazy) квантификаторы
![Page 22: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/22.jpg)
Группировки
22
![Page 23: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/23.jpg)
с захватом
/(boo)/.test("boo"); без захвата
/(?:boo)/.test("boo");
23
Группировки
![Page 24: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/24.jpg)
var result = /(bo)o+(b)/.exec('the booooob'); >>> RegExp.$1 "bo" >>> RegExp.$2 "b" >>> RegExp.$9 "" >>> RegExp.$10 undefined >>> RegExp.$0 undefined
24
Группировки и конструктор RegExp
![Page 25: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/25.jpg)
/((foo) (b(a)r))/ $1 ( ) foo bar $2 ( ) foo $3 ( ) bar $4 ( ) a
25
Порядок нумерации группировок
![Page 26: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/26.jpg)
true /(red|green) apple is \1/.test('red apple is red') true /(red|green) apple is \1/.test('green apple is green')
26
Backreferences
![Page 27: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/27.jpg)
var r = /best(?= match)/.exec('best match'); >>> !!r true >>> r[0] "best" >>> /best(?! match)/.test('best match') false
27
Lookahead
![Page 28: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/28.jpg)
Перечисление
28
![Page 29: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/29.jpg)
/red|green|blue light/ /(red|green|blue) light/ >>> /var a(;|$)/.test('var a') true
29
Логическое «или»
![Page 30: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/30.jpg)
Представление символов
30
![Page 31: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/31.jpg)
\x09 === \t (не Unicode, для ASCII/ANSI) \u20AC === € (для Unicode) обратный slash убирает специальное значение у символа /\(\)/.test('()') // true /\\n/.test('\\n') // true иногда верно и обратное /\f/.test('f') // false!
31
Представление символов
![Page 32: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/32.jpg)
Флаги
32
![Page 33: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/33.jpg)
g i m s x global match ignore case multiline matching for ^ and $ нет поддержки в JS для: string as single line extend pattern
33
Флаги в регулярных выражениях
![Page 34: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/34.jpg)
/(?i)foo/ /(?i-m)bar$/ /(?i-sm).x$/ /(?i)foo(?-i)bar/ Не все реализации поддерживают переключение флагов внутри regexp. JS при таком синтаксисе включает флаги на весь regexp сразу и не даёт менять.
34
Альтернативный синтаксис для флагов
![Page 35: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/35.jpg)
Что почитать
35
![Page 36: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/36.jpg)
36
В интернете: javascript.ru/basic/regular-expression
Mastering Regular Expressions
O'Reilly Media
Книга:
![Page 37: Максим Ширшин — Регулярные выражения](https://reader034.fdocuments.net/reader034/viewer/2022042611/58eb3b311a28ab9c0f8b45fd/html5/thumbnails/37.jpg)
Вопросы?
37