Регулярні вирази у Qt - клас QRegExp

operator > ( QDataStream & in , QRegExp & regExp )

Клас QRegExp надає зіставлення зі зразком за допомогою регулярних виразів.

Регулярний вираз, або "regexp", є зразком для пошуку відповідної підрядки в тексті. Це корисно в багатьох ситуаціях, наприклад:

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

Регулярний вираз надає більш потужні шаблони, ніж просте відповідність рядка, наприклад, відповідність одному зі слів mail, letter або correspondence, але не слів email, mailman, mailer, letterbox і т.д.

Регулярний вираз може замінити всі входження підрядки іншим підрядком, наприклад, замінити всі входження & на & , за винятком випадків, коли за & вже слід amp; .

Регулярний вираз може бути використаний для визначення того, де рядок має бути розділений на частини, наприклад, розділяючи рядок за символами табуляції.

Тут представлено коротке введення в регулярні вирази, опис мови регулярних виразів Qt, деякі приклади і опис функцій. QRegExp змодельований на основі мови регулярних виразів Perl. Він повністю підтримує Unicode. QRegExp може бути використаний у більш простому режимі підстановочних знаків , який аналогічний функціональності, знайденої в командних процесорах. Синтаксичні правила, які використовуються QRegExp, можуть бути змінені за допомогою setPatternSyntax(). Зокрема, синтаксис шаблону може бути встановлений QRegExp::FixedString , що означає, що шаблон для зіставлення трактується як звичайний рядок, тобто. спеціальні символи (наприклад, зворотна похила) не екрануються.

Хорошим текстом про регулярні висловлювання є книга Регулярні вирази (Mastering Regular Expressions) (третє видання) Джеффрі Фрідла (Jeffrey E. F. Friedl), ISBN 0-596-52812-4.

Регулярні вирази створюються з висловів, кванторів та тверджень. Найпростіший вираз - символ, наприклад x або 5 . Виразом може бути набір символів, укладений у квадратні дужки. [ABCD] буде відповідати або A, або B, або C, або D. Ми можемо записати цей вираз як [A-D] , а вираз, що відповідає будь-якій великій літері англійського алфавіту, як [A-Z] .

Квантори визначають кількість входжень висловлювання, котрій шукається відповідність. x означає відповідність одному і лише одному x. x означає відповідність послідовності символів x , яка містить щонайменше один x , але не більше п'яти.

Зауважте, що регулярні вирази не можуть бути використані для перевірки збалансованості дужок або тегів. Наприклад, регулярне вираз може бути написано для пошуку відповідності HTML-тегів, що відкриваєі закриває, якщо тегине вкладені, але якщо тегивкладені, то те ж саме регулярне вираз буде відповідати відкриває тегуз невідповідним йому закриває. Для фрагментаboldbolderпершийбуде узгоджений з першим, що не є коректним. Тим не менш, можна написати регулярний вираз, який відповідатиме вкладеним дужкам або тегам правильно, але тільки в тому випадку, якщо кількість рівнів вкладеності фіксована і відома. Якщо кількість вкладених рівнів не фіксована та/або не відома, то неможливо написати регулярний вираз, який не був би помилковим.

Припустимо, що ми хочемо написати регулярний вираздля відповідності цілим числам в діапазоні від 0 до 99. Потрібно принаймні одна цифра, так що ми починаємо з виразу [0-9], яке відповідає одному вході однієї цифри. Цей регулярний вираз відповідає цілим числам в діапазоні від 0 до 9. Для відповідності цілим числам до 99 збільшимо максимальну кількість входжень до 2, тому регулярне вираз стане [0-9] . Цей регулярний вираз задовольняє вихідну вимогу відповідності цілим числам від 0 до 99, але він також відповідає цілим числам, які можуть перебувати в середині рядка. Якщо ми хочемо, щоб відповідне ціле число було цілим рядком, ми повинні використовувати фіксуючі твердження, ^ (кришка) і $ (долар). Коли ^ є першим символом у регулярному виразі, це означає, що відповідність регулярному виразі має починатися початком рядка. Коли $ є останнім символом у регулярному виразі, це означає, що відповідність регулярному виразу має закінчуватися кінцем рядка. Регулярне вираз стає ^[0-9] $. Зауважте, що твердження, наприклад ^ і $ , відповідають символам, а позиції рядку.

Якщо ви бачили описані регулярні вирази в інших місцях, можливо, вони відрізнялися від представлених тут. Це викликано тим, що деякі набори символів та деякі квантори настільки поширені, що для їхнього представлення були призначені спеціальні символи. [0-9] може бути замінено символом \d. Квантор, що відповідає точно одному входженню, може бути замінений на сам вираз, наприклад, x те ж саме, що і x . Отже, наш вираз для пошуку збігів з 0-99 може бути записаний як ^\d$ . Воно може бути записано як ^\d\d$ , тобто. Від початку рядка відповідність цифрі та відразу за нею 0 або 1 цифра. нана практиці воно буде записано як ^\d\d?$ . ? - це скорочення для квантора, тобто. 0 або 1 входження. ? робить вираз необов'язковим. Регулярний вираз ^\d\d?$ означає Від початку рядка відповідність одній цифрі, відразу за нею 0 або 1 цифра, відразу за нею кінець рядка .

Щоб написати регулярний вираз, що відповідає одному з слів 'mail' , або 'letter' , або 'correspondence', але не відповідне словами, що містять їх, наприклад, 'email', 'mailman', 'mailer' і 'letterbox', почнемо з регулярного виразу, що відповідає 'mail'. У повному вигляді регулярне вираз виглядає як mail, але оскільки символьне вираз автоматично визначається значенням, ми можемо спростити регулярне вираз до mail, тобто. 'm' з наступною за нею 'a' з наступною за нею 'i' з наступною за нею 'l'. Тепер ми можемо використовувати вертикальну рису , яка означає або , для включення двох інших слів, так що наш регулярний вираз для відповідності будь-якому з трьох слів стає maillettercorrespondence . Відповідає 'mail', або 'letter', або 'correspondence'. Хоча цей регулярний вираз і відповідатиме одному з трьох слів, відповідності яким ми вимагаємо, він також відповідатиме словам, відповідності з якими ми не хочемо, наприклад, 'email'. Для запобігання відповідності регулярного вираження небажаним словам ми повинні сказати йому, що відповідність має починатися та закінчуватися на межі слова. Спочатку ми укладемо наш регулярний вираз у круглі дужки (maillettercorrespondence). Круглі дужки групують вирази, а також вони визначають частину виразу, яку хочемо захопити . Висновок виразу в круглі дужки дозволяє нам використовувати його як частину складніших регулярних виразів. Воно також дозволяє намдізнатися, яке із трьох слів збіглося насправді. Щоб змусити відповідність починатися і закінчуватися на межі слова, ми обрамляємо регулярний вираз у твердження \b (межа слова): \b(maillettercorrespondence)\b. Тепер регулярне вираз означає: Відповідність межі слова, за ним слідує регулярне вираз у круглих дужках, за ним слідує межа слова . Твердження відповідає позиції в регулярному вираженні, а не символу . Кордон слова - це будь-який символ, який не входить до слова, наприклад, пробіл, новий рядок або початок або закінчення рядка.

Якщо ми хочемо підрахувати всі входження 'Eric' і 'Eirik' у рядку, то існує два допустимі рішення: \b(EricEirik)\b і \bEi?ri[ck]\b. Затвердження межі слова '\b' необхідне для запобігання відповідності словам, які містять будь-яке з імен, наприклад 'Ericsson'. Зауважте, що друге регулярне вираз відповідає більшій кількості написань, ніж ми хотіли: 'Eric', 'Erik', 'Eiric' та 'Eirik'.

Деякі з розглянутих вище прикладів реалізовані розділ Приклади коду .