Максим Ширшин — Регулярные выражения

Preview:

Citation preview

Школа Разработки Интерфейсов Яндекса

Руководитель Службы разработки интерфейсов Рекламных Технологий

Макс Ширшин

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

Вместо предисловия

2

Виды регулярных выражений

• POSIX (BRE, ERE)

• PCRE = Perl-Compatible Regular Expressions

3

Цитата из стандарта языка JavaScript:

«Вид и функциональность регулярных выражений в JavaScript реализованы по подобию подсистемы регулярных выражений в языке программирования Perl 5»

4

JS-синтаксис (очень кратко)

var re = /^foo/; // boolean re.test('строка'); // null или Array re.exec('строка');

5

Из чего состоят регэкспы

1. Символы

— обычные

— специальные (метасимволы)

2. Операции

— квантификация

— перечисление

— группировка

Метасимволы

6

/./.test('foo'); // true /./.test('\r\n') // false Что вы хотели на самом деле: /[\s\S]/ для JS или /./s (не работает в JS)

7

Любой символ

>>> /^something$/.test('something') true >>> /^something$/.test('something\nbad') false >>> /^something$/m.test('something\nbad') true

8

Границы строк

>>> /\ba/.test('alabama) true >>> /a\b/.test('alabama') true >>> /a\b/.test('naïve') true не-граница слова /\Ba/.test('alabama');

9

Граница слова

Символьные классы

10

/\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

Пробельные символы

/\d/ ~ цифры от 0 до 9 /\w/ ~ буквы, цифры и подчёркивание В JS не работает для русских букв! И наоборот: /\D/ ~ всё, кроме цифр /\W/ ~ всё, кроме букв и цифр

12

Буквы и цифры

Пример: /[abc123]/ Работают метасимволы и диапазоны: /[A-F\d]/ Можно указать несколько диапазонов: /[a-cG-M0-7]/ ВАЖНО: диапазоны берутся из Юникода. При работе с кириллическими диапазонами проверьте порядок символов в Юникоде!

13

Произвольные классы символов

символ «точка» — просто точка! /[.]/.test('anything') // false символы: \ ] - /[\\\]-]/

14

Произвольные классы символов

всё, кроме a, b, c: /[^abc]/ ^ как символ: /[abc^]/

15

Инвертированные символьные классы

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

16

/bo*/.test('b') // true /.*/.test('') // true /bo+/.test('b') // false

17

Ноль или более, один или более

/colou?r/.test('color'); /colou?r/.test('colour');

18

Ноль или один

19

Диапазоны повторов

/bo{7}/ точно 7 /bo{2,5}/ от 2 до 5, x < y /bo{5,}/ 5 или более в JS не работает! /b{,5}/.test('bbbbb')

var r = /a+/.exec('aaaaa'); >>> r[0] "aaaaa"

20

Жадные (greedy) квантификаторы

var r = /a+?/.exec('aaaaa'); >>> r[0] "a" r = /a*?/.exec('aaaaa'); >>> r[0] ""

21

Ленивые (lazy) квантификаторы

Группировки

22

с захватом

/(boo)/.test("boo"); без захвата

/(?:boo)/.test("boo");

23

Группировки

var result = /(bo)o+(b)/.exec('the booooob'); >>> RegExp.$1 "bo" >>> RegExp.$2 "b" >>> RegExp.$9 "" >>> RegExp.$10 undefined >>> RegExp.$0 undefined

24

Группировки и конструктор RegExp

/((foo) (b(a)r))/ $1 ( ) foo bar $2 ( ) foo $3 ( ) bar $4 ( ) a

25

Порядок нумерации группировок

true /(red|green) apple is \1/.test('red apple is red') true /(red|green) apple is \1/.test('green apple is green')

26

Backreferences

var r = /best(?= match)/.exec('best match'); >>> !!r true >>> r[0] "best" >>> /best(?! match)/.test('best match') false

27

Lookahead

Перечисление

28

/red|green|blue light/ /(red|green|blue) light/ >>> /var a(;|$)/.test('var a') true

29

Логическое «или»

Представление символов

30

\x09 === \t (не Unicode, для ASCII/ANSI) \u20AC === € (для Unicode) обратный slash убирает специальное значение у символа /\(\)/.test('()') // true /\\n/.test('\\n') // true иногда верно и обратное /\f/.test('f') // false!

31

Представление символов

Флаги

32

g i m s x global match ignore case multiline matching for ^ and $ нет поддержки в JS для: string as single line extend pattern

33

Флаги в регулярных выражениях

/(?i)foo/ /(?i-m)bar$/ /(?i-sm).x$/ /(?i)foo(?-i)bar/ Не все реализации поддерживают переключение флагов внутри regexp. JS при таком синтаксисе включает флаги на весь regexp сразу и не даёт менять.

34

Альтернативный синтаксис для флагов

Что почитать

35

36

В интернете: javascript.ru/basic/regular-expression

Mastering Regular Expressions

O'Reilly Media

Книга:

Вопросы?

37

Руководитель Службы разработки интерфейсов Рекламных Технологий

ingdir@yandex-team.ru

Макс Ширшин

Recommended