Регулярні вирази
Регулярні вирази (скорочено – регекси) дають розробникам змогу шукати збіги з патернами, а також просто перевіряти, чи відповідає рядок патернові. Регулярні вирази використовуються в багатьох мовах програмування, і їх синтаксис у JavaScript навіяний мовою Perl.
Заохочується прочитання посібника з регулярних виразів, щоб отримати огляд доступних можливостей синтаксису регулярних виразів та того, як вони працюють.
Опис
Регулярні вирази – це важливий концепт у теорії формальних мов. Вони є способом описати множину рядків, що може бути нескінченною (така множина називається мовою). Регулярний вираз, своєю чергою, потребує наступних властивостей:
- Набору символів, що можуть вживатися у мові, – цей набір називається алфавітом.
- Зчеплення:
abозначає "символa, за яким слідує символb". - Об'єднання:
a|bозначає "абоa, абоb". - Зірочки Кліні:
a*означає "нуль або більше символівa".
Виходячи з припущення, що алфавіт є скінченним (подібно до 33 літер українського алфавіту, а також до всього набору символів Unicode), всі регулярні мови можуть бути згенеровані на основі властивостей вище. Звісно, чимало патернів дуже марудно виражати у такий спосіб (як "10 цифр" або "символ, що не є пробілом"), тож регулярні вирази JavaScript включають чимало скорочень, які будуть представлені нижче.
[!NOTE] Регулярні вирази 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 |
Позначки i, m і s можна вмикати та вимикати для конкретних частин регулярного виразу за допомогою синтаксису модифікатора.
Розділи нижче перераховують усі доступні можливості синтаксису регулярних виразів, згруповані за їх синтаксичною природою.
Твердження
Твердження – це конструкції, що перевіряють, чи відповідає рядок певній умові на вказаній позиції, але не поглинають символи. Твердження не можуть бути квантовані.
- Твердження про початок та кінець рядка –
^,$ Стверджує те, що поточна позиція є початком або кінцем вихідних даних, або початком чи кінцем рядка тексту, якщо задана позначка
m.- Твердження визирання –
(?=...),(?!...) Стверджує те, що після поточної позиції стоїть або не стоїть певний патерн.
- Твердження озирання –
(?<=...),(?<!...) Стверджує те, що перед поточною позицією стоїть або не стоїть певний патерн.
- Твердження меж слів –
\b,\B Стверджує те, що поточна позиція є межею слова.
Атоми
Атоми – найбазовіші одиниці регулярного виразу. Кожний атом поглинає один або більше символів у рядку, і або провалює збіг, або дозволяє патернові продовжити зіставлення наступним атомом.
- Зворотне посилання –
\1,\2 Дає збіг з попереднім збігом-підрядком, захопленим групою захоплення.
- Група захоплення –
(...) Дає збіг з підпатерном та запам'ятовує інформацію про збіг.
- Клас символів –
[...],[^...] Дає збіг з будь-яким символом, що присутній або відсутній в наборі символів. Коли ввімкнено позначку
v, такий атом також може використовуватися для пошуку в рядках скінченної довжини.- Екранування класу символів –
\d,\D,\w,\W,\s,\S Дає збіг з будь-яким символом, що присутній або відсутній в наперед визначеному наборі символів.
- Екранування символу –
\n,\u{...} Дає збіг з символом, що може бути незручно виразити у його літеральній формі.
- Літеральний символ –
a,b Дає збіг з конкретним символом.
- Модифікатор –
(?ims-ims:...) Перезадає налаштування позначок для конкретної частини регулярного виразу.
- Іменоване зворотне посилання –
\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 – нульовий символ) |
Символ \, після якого стоїть 0, а далі будь-який інший цифровий символ, стає історичною вісімковою екранувальною послідовністю, котра заборонена в режимі з урахуванням Unicode. \, після якої стоїть будь-яка інша цифрова послідовність, стає зворотним посиланням.
Крім цього, після \ можуть стояти певні нелітерні та нецифрові символи, у випадку чого екранувальна послідовність завжди є екрануванням символу, що відповідає самому екранованому символу:
\$,\(,\),\*,\+,\.,\/,\?,\[,\\,\],\^,\\{,\|,\\}: валідні завжди\-: дійсний лише всередині класів символів\!,\#,\%,\&,\,,\:,\;,\<,\=,\>,\@,\`,\~: валідні лише всередині класів символів режимуv
Решта символів ASCII, а саме – символ пробілу, ", ', _ та будь-які літерні символи, не згадані вище, не є дійсними екранувальними послідовностями. У режимі з урахуванням Unicode екранувальні послідовності, що не належать до перелічених вище, стають екрануваннями ідентичності: вони відповідають символові, що стоїть після зворотної скісної риски. Наприклад, \a відповідає символові a. Така поведінка обмежує змогу запроваджувати нові екранувальні послідовності, не спричиняючи проблем зворотної сумісності, і тому заборонена в режимі з урахуванням Unicode.
Специфікації
Сумісність із браузерами
Дивіться також
- Посібник Регулярні вирази
RegExp