Регулярні вирази

Регулярні вирази (скорочено – регекси) дають розробникам змогу шукати збіги з патернами, а також просто перевіряти, чи відповідає рядок патернові. Регулярні вирази використовуються в багатьох мовах програмування, і їх синтаксис у 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.

Крім цього, після \ можуть стояти певні нелітерні та нецифрові символи, у випадку чого екранувальна послідовність завжди є екрануванням символу, що відповідає самому екранованому символу:

Решта символів ASCII, а саме – символ пробілу, ", ', _ та будь-які літерні символи, не згадані вище, не є дійсними екранувальними послідовностями. У режимі з урахуванням Unicode екранувальні послідовності, що не належать до перелічених вище, стають екрануваннями ідентичності: вони відповідають символові, що стоїть після зворотної скісної риски. Наприклад, \a відповідає символові a. Така поведінка обмежує змогу запроваджувати нові екранувальні послідовності, не спричиняючи проблем зворотної сумісності, і тому заборонена в режимі з урахуванням Unicode.

Специфікації

Якщо ви це бачите — значить, щось трапилося з цією сторінкою.

Сумісність із браузерами

Якщо ви це бачите — значить, щось трапилося з цією сторінкою.

Дивіться також