Регулярні вирази
Регулярні вирази (скорочено – регекси) дають розробникам змогу шукати збіги з патернами, а також просто перевіряти, чи відповідає рядок патернові. Регулярні вирази використовуються в багатьох мовах програмування, і їх синтаксис у JavaScript навіяний мовою Perl.
Заохочується прочитання посібника з регулярних виразів, щоб отримати огляд доступних можливостей синтаксису регулярних виразів та того, як вони працюють.
Опис
Регулярні вирази – це важливий концепт у теорії формальних мов. Вони є способом описати множину рядків, що може бути нескінченною (така множина називається мовою). Регулярний вираз, своєю чергою, потребує наступних властивостей:
- Набору символів, що можуть вживатися у мові, – цей набір називається алфавітом.
- Зчеплення:
ab
означає "символa
, за яким слідує символb
". - Об'єднання:
a|b
означає "абоa
, абоb
". - Зірочки Кліні:
a*
означає "нуль або більше символівa
".
Виходячи з припущення, що алфавіт є скінченним (подібно до 33 літер українського алфавіту, а також до всього набору символів Unicode), всі регулярні мови можуть бути згенеровані на основі властивостей вище. Звісно, чимало патернів дуже марудно виражати у такий спосіб (як "10 цифр" або "символ, що не є пробілом"), тож регулярні вирази JavaScript включають чимало скорочень, які будуть представлені нижче.
Примітка: Регулярні вирази JavaScript насправді не є регулярними, через існування зворотних посилань (регулярні вирази повинні мати скінченну кількість станів). Однак вони все одно є дуже корисною можливістю.
Створення регулярних виразів
Здебільшого регулярний вираз створюється як літерал, шляхом оточення патерну скісними рисками (/
):
const regex1 = /ab+c/g;
Також регулярні вирази можна створювати за допомогою конструктора RegExp()
:
const regex2 = new RegExp("ab+c", "g");
Між цими способами немає різниці щодо їх виконання, хоча вони можуть впливати на продуктивність, статичну аналізовність та проблеми з ергономікою написання при екрануванні символів. Більше інформації – у довідці RegExp
.
Позначки регексів
Позначки – особливі параметри, що можуть змінювати спосіб, у який регулярний вираз тлумачиться, або спосіб, у який він взаємодіє з вихідним текстом. Кожна позначка відповідає акцесорній властивості на об'єкті RegExp
.
Позначка | Опис | Відповідна властивість |
---|---|---|
d |
Генерувати індекси для збігів-підрядків. | hasIndices |
g |
Глобальний пошук. | global |
i |
Чутливий до регістру пошук. | ignoreCase |
m |
Дозволяє ^ та $ давати збіг поруч з символами нового рядка. |
multiline |
s |
Дозволяє . давати збіг з символами нового рядка. |
dotAll |
u |
"Unicode"; розглядати патерн як послідовність кодових точок Unicode. | unicode |
v |
Покращена версія режиму u з більшою кількістю можливостей Unicode. |
unicodeSets |
y |
Виконувати "липкий" пошук, що виконує пошук, починаючи з поточної позиції в цільовому рядку. | sticky |
Розділи нижче перераховують усі доступні можливості синтаксису регулярних виразів, згруповані за їх синтаксичною природою.
Твердження
Твердження – це конструкції, що перевіряють, чи відповідає рядок певній умові на вказаній позиції, але не поглинають символи. Твердження не можуть бути квантовані.
- Твердження про початок та кінець рядка –
^
,$
Стверджує те, що поточна позиція є початком або кінцем вихідних даних, або початком чи кінцем рядка тексту, якщо задана позначка
m
.- Твердження визирання –
(?=...)
,(?!...)
Стверджує те, що після поточної позиції стоїть або не стоїть певний патерн.
- Твердження озирання –
(?<=...)
,(?<!...)
Стверджує те, що перед поточною позицією стоїть або не стоїть певний патерн.
- Твердження меж слів –
\b
,\B
Стверджує те, що поточна позиція є межею слова.
Атоми
Атоми – найбазовіші одиниці регулярного виразу. Кожний атом поглинає один або більше символів у рядку, і або провалює збіг, або дозволяє патернові продовжити зіставлення наступним атомом.
- Зворотне посилання –
\1
,\2
Дає збіг з попереднім збігом-підрядком, захопленим групою захоплення.
- Група захоплення –
(...)
Дає збіг з підпатерном та запам'ятовує інформацію про збіг.
- Клас символів –
[...]
,[^...]
Дає збіг з будь-яким символом, що присутній або відсутній в наборі символів. Коли ввімкнено позначку
v
, такий атом також може використовуватися для пошуку в рядках скінченної довжини.- Екранування класу символів –
\d
,\D
,\w
,\W
,\s
,\S
Дає збіг з будь-яким символом, що присутній або відсутній в наперед визначеному наборі символів.
- Екранування символу –
\n
,\u{...}
Дає збіг з символом, що може бути незручно виразити у його літеральній формі.
- Літеральний символ –
a
,b
Дає збіг з конкретним символом.
- Іменоване зворотне посилання –
\k<name>
Дає збіг з попередньо знайденим підпатерном, захопленим за допомогою іменованої групи захоплення.
- Іменована група захоплення –
(?<name>...)
Дає збіг з підпатерном і зберігає інформацію про нього. Така група пізніше може бути ідентифікована за допомогою імені, а не індексу в патерні.
- Незахоплювальна група –
(?:...)
Дає збіг з підпатерном, не запам'ятовуючи інформацію про нього.
- Екранування класу символів Unicode –
\p{...}
,\P{...}
Дає збіг з набором символів, визначених властивістю Unicode. Коли ввімкнено позначку
v
, такий атом також може використовуватися для пошуку в рядках скінченної довжини.- Джокер –
.
Дає збіг з будь-яким символом, окрім символів кінця рядка, якщо не задано позначку
s
.
Інші можливості
Ці можливості самі собою не задають жодного патерну, але використовуються для компонування патернів.
- Диз'юнкція –
|
Дає збіг з будь-чим із набору варіантів, розділених символом
|
.- Квантор –
*
,+
,?
,{n}
,{n,}
,{n,m}
Дає збіг з атомом задану кількість разів.
Екранувальні послідовності
Екранувальними послідовностями в регулярних виразах звуть будь-якого роду запис, сформований символом \
, після якого – один або більше символів. Такі послідовності можуть мати дуже різні цілі, залежно від того, що стоїть після \
. Нижче наведений список всіх дійсних "екранувальних послідовностей":
Екранувальна послідовність | Після неї | Значення |
---|---|---|
\B |
Нічого | Твердження про відсутність межі слова |
\D |
Нічого | Екранування класу символів, що відповідає нецифровим символам |
\P |
{ , властивість чи значення Unicode, а потім } |
Екранування класу символів Unicode, що відповідає символам без заданої властивості Unicode |
\S |
Нічого | Екранування класу символів, що відповідає непробільним символам |
\W |
Нічого | Екранування класу символів, що відповідає невимовним символам |
\b |
Нічого | Твердження про межу слова; всередині класів символів відповідає U+0008 (BACKSPACE – реверс) |
\c |
Літера від A до Z або від a до z |
Екранування символу, що відповідає контрольному символові зі значенням, що дорівнює остачі від ділення значення літери на 32 |
\d |
Нічого | Екранування класу символів, що відповідає цифровим символам (від 0 до 9 ) |
\f |
Нічого | Екранування символу, що відповідає U+000C (FORM FEED – кінець сторінки) |
\k |
< , ідентифікатор, потім > |
Іменоване зворотне посилання |
\n |
Нічого | Екранування символу, що відповідає U+000A (LINE FEED – кінець рядка) |
\p |
{ , властивість чи значення Unicode, потім } |
Екранування класу символів Unicode, що відповідає символам із заданою властивістю Unicode |
\q |
{ , рядок, потім } |
Дійсний лише всередині класів символів режиму v ; відповідає буквальному збігові з рядком |
\r |
Нічого | Екранування символу, що відповідає U+000D (CARRIAGE RETURN - повернення каретки) |
\s |
Нічого | Екранування класу символів, що відповідає пробільним символам |
\t |
Нічого | Екранування символу, що відповідає U+0009 (CHARACTER TABULATION – табуляція) |
\u |
4 шістнадцяткові цифри; або { , від 1 до 6 шістнадцяткових цифр, потім } |
Екранування символу, що відповідає символові з заданою кодовою точкою |
\v |
Нічого | Екранування символу, що відповідає U+000B (LINE TABULATION – вертикальна табуляція) |
\w |
Нічого | Екранування класу символів, що відповідає вимовним символам (від A до Z , від a до z , від 0 до 9 , _ ) |
\x |
2 шістнадцяткові цифри | Екранування символу, що відповідає символові з заданим значенням |
\0 |
Нічого | Екранування символу, що відповідає U+0000 (NULL – нульовий символ) |
Символ \
, після якого стоїть будь-який інший цифровий символ, стає історичною вісімковою екранувальною послідовністю, котра заборонена в режимі з урахуванням Unicode.
Крім цього, після \
можуть стояти певні нелітерні та нецифрові символи, у випадку чого екранувальна послідовність завжди є екрануванням символу, що відповідає самому екранованому символу:
\$
,\(
,\)
,\*
,\+
,\.
,\/
,\?
,\[
,\\
,\]
,\^
,\{
,\|
,\}
: дійсні завжди\-
: дійсний лише всередині класів символів\!
,\#
,\%
,\&
,\,
,\:
,\;
,\<
,\=
,\>
,\@
,\`
,\~
: дійсні лише всередині класів символів режимуv
Решта символів ASCII, а саме – символ пробілу, "
, '
, _
та будь-які літерні символи, не згадані вище, не є дійсними екранувальними послідовностями. У режимі з урахуванням Unicode екранувальні послідовності, що не належать до перелічених вище, стають екрануваннями ідентичності: вони відповідають символові, що стоїть після зворотної скісної риски. Наприклад, \a
відповідає символові a
. Така поведінка обмежує змогу запроваджувати нові екранувальні послідовності, не спричиняючи проблем зворотної сумісності, і тому заборонена в режимі з урахуванням Unicode.
Специфікації
Сумісність із браузерами
Дивіться також
- Посібник Регулярні вирази
RegExp