Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
2013 09 21 регулярные выражения
1. Школа
Разработки
Интерфейсов
Яндекса
Симферополь,
2013
Руководитель
группы
разработки
интерфейсов
Рекламной
Сети
Яндекса
Макс
Ширшин
Регулярные
выражения
3. Виды
регулярных
выражений
• POSIX
(BRE,
ERE)
• PCRE
=
Perl-‐CompaYble
Regular
Expressions
3
Цитата
из
стандарта
языка
JavaScript:
«Вид
и
функциональность
регулярных
выражений
в
JavaScript
реализованы
по
подобию
подсистемы
регулярных
выражений
в
языке
программирования
Perl
5»
27. /s/
(инвертированный
вариант
/S/)
FF:
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
27
Пробельные
символы
28. /d/
~
цифры
от
0
до
9
/w/
~
буквы,
цифры
и
подчёркивание
В
JS
не
работает
для
русских
букв!
И
наоборот:
/D/
~
всё,
кроме
цифр
/W/
~
всё,
кроме
букв
и
цифр
28
Буквы
и
цифры
30. Пример:
/[abc123]/
Работают
метасимволы
и
диапазоны:
/[A-‐Fd]/
30
Произвольные
классы
символов
31. Пример:
/[abc123]/
Работают
метасимволы
и
диапазоны:
/[A-‐Fd]/
Можно
указать
несколько
диапазонов:
/[a-‐cG-‐M0-‐7]/
31
Произвольные
классы
символов
32. Пример:
/[abc123]/
Работают
метасимволы
и
диапазоны:
/[A-‐Fd]/
Можно
указать
несколько
диапазонов:
/[a-‐cG-‐M0-‐7]/
ВАЖНО:
диапазоны
берутся
из
Юникода.
При
работе
с
кириллическими
диапазонами
проверьте
порядок
символов
в
Юникоде!
32
Произвольные
классы
символов
33. символ
«точка»
—
просто
точка!
/[.]/.test('anything')
//
false
33
Произвольные
классы
символов
34. символ
«точка»
—
просто
точка!
/[.]/.test('anything')
//
false
символы:
]
-‐
/[]-‐]/
34
Произвольные
классы
символов
35. всё,
кроме
a,
b,
c:
/[^abc]/
^
как
символ:
/[abc^]/
35
Инвертированные
символьные
классы
74. true
/(red|green)
apple
is
1/.test('red
apple
is
red')
true
/(red|green)
apple
is
1/.test('green
apple
is
green')
74
Backreferences
(обратные
ссылки)
76. x09
===
t
(не
Unicode,
для
ASCII/ANSI)
u20AC
===
€
(для
Unicode)
76
Представление
символов
77. x09
===
t
(не
Unicode,
для
ASCII/ANSI)
u20AC
===
€
(для
Unicode)
обратный
slash
убирает
специальное
значение
у
символа
/()/.test('()')
//
true
/n/.test('n')
//
true
77
Представление
символов
78. x09
===
t
(не
Unicode,
для
ASCII/ANSI)
u20AC
===
€
(для
Unicode)
обратный
slash
убирает
специальное
значение
у
символа
/()/.test('()')
//
true
/n/.test('n')
//
true
иногда
верно
и
обратное
/f/.test('f')
//
false!
78
Представление
символов
81. g
i
m
s
x
global
match
81
Флаги
в
регулярных
выражениях
82. g
i
m
s
x
global
match
ignore
case
82
Флаги
в
регулярных
выражениях
83. g
i
m
s
x
global
match
ignore
case
multiline
matching
for
^
and
$
83
Флаги
в
регулярных
выражениях
84. g
i
m
s
x
global
match
ignore
case
multiline
matching
for
^
and
$
нет
поддержки
в
JS
для:
string
as
single
line
extend
pattern
84
Флаги
в
регулярных
выражениях
85. /(?i)foo/
/(?i-‐m)bar$/
/(?i-‐sm).x$/
/(?i)foo(?-‐i)bar/
Не
все
реализации
поддерживают
переключение
флагов
внутри
regexp.
JS
при
таком
синтаксисе
включает
флаги
на
весь
regexp
сразу
и
не
даёт
менять.
85
Альтернативный
синтаксис
для
флагов
87. экземпляры
RegExp:
/regexp/.exec('строка')
null
или
массив
['всё
совпадение',
$1,
$2,
...]
/regexp/.test('строка')
false
или
true
экземпляры
String:
'str'.match(/regexp/)
'str'.match('w{1,3}')
-‐
эквивалент
/regexp/.exec,
если
нет
флага
g;
-‐
массив
всех
совпадений
по
строке,
если
есть
флаг
g
(внутренние
группировки
игнорируются)
'str'.search(/regexp/)
'str'.search('w{1,3}')
позиция
первого
совпадения
или
-‐1
87
Методы
88. экземпляры
String:
'str'.replace(/old/,
'new');
В
строке
замены
поддерживаются
следующие
спецсимволы:
$$
вставляет
значок
доллара
"$"
$&
подстрока,
совпавшая
с
регэкспом
$`
подстрока
до
$&
$'
подстрока
после
$&
$1,
$2,
$3
и
т.д.:
cтрока,
совпавшая
с
соответствующей
скобочной
группировкой
'str'.replace(/(r)(e)gexp/g,
function(matched,
$1,
$2,
offset,
sourceString)
{
//
чем
заменить
matched
на
этом
шаге?
return
'замена';
});
88
Методы
89. //
ПЛОХО
var
re
=
new
RegExp('^'
+
userInput
+
'$');
var
userInput
=
'[abc]';
//
ХОРОШО
RegExp.escape
=
function(text)
{
return
text.replace(/[-‐[]{}()*+?.,^$|#s]/g,
"$&");
};
var
re
=
new
RegExp('^'
+
RegExp.escape(userInput)
+
'$');
89
RegExp
injecYon