CodeNix

692378482

codenix.sv

admin@codenix.net

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

Опубліковано: Категорія: Різне Переглядів: 458

різне regular expression

Регулярні вирази - потужний гнучкий інструмент для синтаксичного аналізу тексту у відповідності з певним шаблоном.

Шаблон - рядок символів, спецсимволов і модифікаторів, що описують правила, яким повинен відповідати оброблюваний текст. Будь-який шаблон повинен бути обмежений символами-обмежувачами. В якості таких символів можна використовувати будь-який не буквено-цифровий символ крім \.

Не рекомендується використовувати в якості обмежувачів також інші спеціальні символи, з причини того, що їх використання усередині шаблону стане незручним. Найчастіше використовують символ / чи ~, тому що вони не виконують ніяких спеціальних функцій.

Символ, використовуваний в якості обмежувача шаблону, в тілі шаблону повинен екрануватися.

Спецсимволи

  • \ - символ екранування. Приклад: /qwe\/rty/ - відповідає рядку, в якому є qwe/rty. Символ / ми заекранували, після чого він перестав виконувати в даному місці своє спеціальне значення (він був обмежувачем шаблону).
  • ^ - символ початку даних.
  • $ - символ кінця даних. Приклад: /^pattern$/ - відповідає рядку, який точно збігається з словом pattern. Тобто з букви p рядок починається і після n закінчується.
  • . - будь-який символ, крім переходу рядка. Але є модифікатор, при використанні якого перехід рядка теж відноситься до "будь-яких" символів. Приклад: /pat.ern/ - відповідає рядку, що містить pattern, або patdern, або pat3ern.
  • [] - всередині цих дужок перераховуються символи, будь-який один символ з яких може стояти на даному місці. Це називається символьним класом. Спецсимволи, написані в [] поводяться трохи по-іншому. Приклад: /pat[aoe]rn/ - під відповідність потраплять рядки, що містять patarn, patorn або patern.
  • | - або.
  • () - подмаски.
  • ? - одне або нуль входжень попереднього символу або подмаски.
  • * - будь-яка кількість входжень попереднього символу або подмаски. У тому числі і нуль.
  • + - Одне або більше входжень. Приклад: /as+(es|du)?.*r/ - Буква а, потім одна або більше букв s, після цього поєднання es або du може бути один раз, а може і жодного разу, потім будь-яку кількість будь-яких символів і буква r.
  • {a, b} - кількість входжень попереднього символу або подмаскі від a до b. Якщо b не вказано, вважається, що верхньої межі немає. Наприклад, * - те ж саме, що {0,}. ? - те ж, що {0,1}. {5,7} - 5,6 або 7 повторень.

Спецсимволи всередині символьного класу

  • ^ - заперечення. Приклад: [^da] - відповідає будь-якому символу крім d і a. Приклад: [^^] - відповідає будь-якому символу крім ^.[d^a] - відповідає будь-якому символу з перерахованих трьох. В останньому прикладі, як видно символ стоїть не на початку перерахування тому свою метафункцію втрачає. І екранувати його, до речі, теж тут не треба.
  • - - всередині символьного класу означає символьний інтервал. Приклад: [0-9a-e] - відповідає будь-якому символу від 0 до 9 і від a до e. Якщо в символьному класі треба перерахувати сам символ дефіса, то слід його або заекранувати, або розмістити перед ].

Спецсимволи з \

  • \f - розрив сторінки.
  • \n, \r, \t - перехід рядка, повернення каретки і табуляція.
  • \d - будь-який символ, що означає десяткову цифру.
  • \D - будь-який символ, що не означає десяткову цифру.
  • \s - будь пробільний символ.
  • \S - будь-який не пробільний символ.
  • \w - будь-яка цифра, буква або знак підкреслення.
  • \W - будь-який символ, але не \w.
  • \b - межа слова. Можна використовувати замість \w\W або \W\w або ^\w або \w$
  • \B - не межа слова.

Модифікатори

  • і - регістронезалежність.
  • U - інвертує жадібність.
  • m - багаторядковий пошук.
  • s - якщо використовується, то символ . відповідає переходу рядка. Інакше вона йому не відповідає.
  • x - змушує ігнорувати всі неекрановані пробільні символи, якщо вони не перераховані в символьному класі

Твердження

Твердження - це перевірки щодо символів, що йдуть до або після поточної позиції зіставлення. Наприклад, \b - це твердження, що попередній символ словесний, а наступний - ні, або навпаки.

Твердження щодо подальшого тексту починаються з (?= для істинних тверджень і з (?! Для заперечувальних тверджень.

Твердження щодо попереднього тексту починаються з (?<= для істинних тверджень і (? для заперечувальних.

Наприклад, /(?<!Foo)bar/ не знайде входження bar, яким не передує foo. Тобто qwefoobar цей шаблон проігнорує, а asacdbar під нього підійде.

Твердження можуть бути вкладеними, причому в довільних поєднаннях.

Умовні підмаскі

(?(condition)yes-pattern|no-pattern)


Коментарі