520.98K
Category: programmingprogramming

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

1.

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

2.

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

3.

Виды регулярных выражений
• POSIX (BRE, ERE)
• PCRE = Perl-Compatible Regular Expressions
Цитата из стандарта языка JavaScript:
«Вид и функциональность регулярных
выражений в JavaScript реализованы
по подобию подсистемы регулярных
выражений в языке программирования Perl 5»
3

4.

JS-синтаксис (очень кратко)
var re = /^foo/;
// boolean
re.test('строка');
// null или Array
re.exec('строка');
4

5.

Из чего состоят регэкспы
1. Символы
— обычные
— специальные (метасимволы)
2. Операции
— квантификация
— перечисление
— группировка
5

6.

Метасимволы
6

7.

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

8.

Границы строк
>>> /^something$/.test('something')
true
>>> /^something$/.test('something\nbad')
false
>>> /^something$/m.test('something\nbad')
true
8

9.

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

10.

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

11.

Пробельные символы
/\s/ (инвертированный вариант /\S/)
FF 12:
\t
\n
\u1680 \u180e
\u2005 \u2006
\u2029\ u202f
\v
\u2000
\u2007
\u205f
\f
\r
\u0020 \u00a0
\u2001 \u2002 \u2003 \u2004
\u2008 \u2009 \u200a\ u2028
\u3000
Chrome 19, IE 9:
как в FF 12 и ещё \ufeff
IE 7, 8 :-(
только:
\t \n \v \f \r \u0020
11

12.

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

13.

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

14.

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

15.

Инвертированные
символьные классы
всё, кроме a, b, c:
/[^abc]/
^ как символ:
/[abc^]/
15

16.

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

17.

Ноль или более, один или
более
/bo*/.test('b') // true
/.*/.test('')
// true
/bo+/.test('b') // false
17

18.

Ноль или один
/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')
19

20.

Жадные (greedy)
квантификаторы
var r = /a+/.exec('aaaaa');
>>> r[0]
"aaaaa"
20

21.

Ленивые (lazy) квантификаторы
var r = /a+?/.exec('aaaaa');
>>> r[0]
"a"
r = /a*?/.exec('aaaaa');
>>> r[0]
""
21

22.

Группировки
22

23.

Группировки
с захватом
/(boo)/.test("boo");
без захвата
/(?:boo)/.test("boo");
23

24.

Группировки и конструктор RegExp
var result = /(bo)o+(b)/.exec('the booooob');
>>> RegExp.$1
"bo"
>>> RegExp.$2
"b"
>>> RegExp.$9
""
>>> RegExp.$10
undefined
>>> RegExp.$0
undefined
24

25.

Порядок нумерации группировок
/((foo) (b(a)r))/
$1 (
$2 (
$3
$4
25
)
)
(
)
( )
foo bar
foo
bar
a

26.

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

27.

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

28.

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

29.

Логическое «или»
/red|green|blue light/
/(red|green|blue) light/
>>> /var a(;|$)/.test('var a')
true
29

30.

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

31.

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

32.

Флаги
32

33.

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

34.

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

35.

Что почитать
35

36.

В интернете:
javascript.ru/basic/regular-expression
Книга:
Mastering Regular Expressions
O'Reilly Media
36

37.

Вопросы?
37

38.

Макс Ширшин
Руководитель Службы разработки
интерфейсов Рекламных Технологий
[email protected]
English     Русский Rules