Регулярні вирази, уроки, шаблони для zennoposter


Регулярні вирази досить широко використовуються в програмі, а саме:
- Для пошуку елементів;
- Під час парсинга даних з веб-сайтів або з файлу;

- Для зручності обробки даних з різних джерел (заміні або видалення фрагментів тексту);
- При установці роздільників в списках і таблицях;
- Багато іншого.

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

Для побудови регулярних виразів в програмі є спеціальний інструмент - «Конструктор регулярних виразів». У ньому можна протестувати готові вираження, а так само скласти свої.

Візьмемо текст і складемо на його прикладі регулярний вираз так, щоб отримати домени сайтів:


У Конструкторі є роздільні поля - текст, який йде перед шуканим (a href = "), з якого починається (http:), закінчується шуканий текст (.com), що йде після нього (">). В результаті ми отримаємо наступне регулярний вираз:

і список доменів в результатах тестування.

Регулярні вирази, уроки, шаблони для zennoposter

Так само в Конструкторі є два чекбокса:
1) Дозволити переноси - вмикає і вимикає пошук по тексту з урахуванням переносів рядків (при включенні даної опції, регулярний вираз не обмежена пошуком в межах одного рядка, а так само враховує переноси рядків);


2) найкоротший збіг - вмикає і вимикає пошук найкоротшого збіги. При включенні даної опції, в результатах ми отримаємо найкоротшу подстроку, відповідну складеним висловом. При виключенні, відповідно - найдовшу.


При заповненні цих полів, Ваш текст автоматично перетворюється і в поле "Текст регулярного виразу" буде надано готове вираз, яке можна використовувати для пошуку.
Конструктор регулярних виразів, який є в програмі Zennoposter, досить не поганий, але не універсальний. Він підходить для складання простих виразів, коли ми маємо точні співпадіння в тексті - що йде перед або після тексту, який нам потрібно знайти, чим він починається або чим закінчується. Іноді, отриманий результат буває незадовільним - рядків більше або менше, ніж потрібно, або просто замість шуканого тексту ми отримуємо різне сміття. У таких випадках необхідні більш широкі знання і правка виразів, сформованих Конструктором, вручну.

Для того, щоб правильно самостійно скласти регулярні вирази, розглянемо основні символи, визначимо в якій ситуації вони можуть використовуватися.

«. »- будь-який символ, крім розриву рядків (\ n);
«\ D» - цифровий символ, тобто будь-яка цифра від 0 до 9;
«[0-9]» - цифровий діапазон - відрізняється від \ d тим, що в даному виді є можливість вказати не будь-який цифровий символ, а використовуючи діапазони, наприклад [1-3], який знайде тільки цифри 1, 2 і 3;
«\ D» - не цифровий символ. Тобто всі символи - літерні та прогалини, крім цифр;
«\ S» -все пробільні символи, які можуть включати в себе:
- пробіл «\»;
- нова сторінка «\ f»;
- повернення каретки «\ r»;
- новий рядок «\ n»;
- знак табуляції «\ t»;
- знак вертикальної табуляції «\ v»;
«\ S» - не символ пробілу, тобто всі букви, цифри і знаки. Все, що не перераховане вище, як пробільні символи.
«\ W» - буквений або цифровий символ або знак підкреслення.
«\ W» - будь-який символ, крім літерного або цифрового символу або знака підкреслення.

Наприклад, нам потрібно перевірити, чи містить рядок слово "Червоний", прописавши в конструкторі «червоний», ми можемо отримати так само й інші слова, в які входить дане слово, такі як "прекрасний" і т.д. Що б цього не відбувалося, необхідно прописати \ bкрасний \ b - таким чином, всі слова, які можуть бути схожі на шукане враховуватися не будуть.
Чи не межа слова, відповідно, працює навпаки. Наприклад, ми знаємо, що слово має закінчуватися на "жили", але саме слово "жили" нам не потрібно, тоді ми прописуємо \ Bжілі і отримуємо список слів з потрібним нам закінченням - дорожили, вижили і т.д.

Квантіфікатори встановлюються після символів, число повторень які ви хочете зробити.
Візьмемо для прикладу точку, яка позначає будь-який символ, і складемо регулярний вираз, яким буде відповідати будь-яка послідовність з 4 символів. Результат буде виглядати таким чином:.
Так можна вказати, що всередині шуканого тексту є встановлене або необмежене число повторень встановлених символів, тобто .:
С.Л - таке регулярний вираз знайде такі слова, як стіл, стілець і т.д. але йому так само буде відповідати рядок, що має в середині прогалини, цифри та інше.


Регулярні вирази, уроки, шаблони для zennoposter

Для того, щоб вказати, що всередині будуть тільки букви, необхідно прописати таким чином:

Регулярні вирази, уроки, шаблони для zennoposter


Так само можна задати певну послідовність або набір символів, які повинні враховуватися. Для цього використовуються квадратні дужки, всередині яких прописуються діапазони, або набори символів.


Для вказівки діапазонів використовується тире між значеннями. Для перерахування, символи просто прописуються в рядок без будь-яких роздільників.
[A-zA-Z1-5абв] - дана послідовність позначає будь-яку англійську букву в верхньому і нижньому регістрі, числа від 1 до 5 включно, а так само російські літери а, б і в.

Регулярний вираз матиме такий вигляд:

Ми позначаємо, що після букви "з" йдуть 2 будь-яких символу, зазначених в квадратних дужках і дана послідовність знайде слова стіл і стілець, але йому так само будуть відповідати послідовності букв "суул", "Сутлі" та інші.

(? I) - включає нечутливість вираження до регістру символів;


(? -i) - вимикає нечутливість вираження до регістру символів.

Використовуючи дані модифікатори, ми можемо вказувати регулярному виразу, важливий нам регістр символів при пошуку соваденій. Відключивши регістр на початку регулярного виразу, ми його виключаємо для всіх наступних збігів в рядку.

Регулярні вирази, уроки, шаблони для zennoposter
Регулярні вирази, уроки, шаблони для zennoposter

Так само бувають випадки, коли в одному місці регістр для нас не важливий, а в іншому важливий.

Регулярні вирази, уроки, шаблони для zennoposter

Дане регулярний вираз знайде рядок "Test, TEST", тому що у першій фрази включена нечутливість до регістру і вона знаходить все збіги, але не знайде "TEST, Test", тому що у другій фразі повинно бути точний збіг по регістру.

Модифікатори многострочного пошуку:
(? M) - включає багатостроковий пошук
(? -m) - відключає багатостроковий пошук

Для того щоб знайти всі рядки, що починаються з не пробільного символу, підійде таке регулярний вираз:
(? M) ^ \ S. *

Символи, які повинні екрануватися, для того, щоб вони були враховані в регулярному виразі як текст, а не як частина регулярного виразу (метасимволу):

При використанні даних символів в регулярному виразі, як частини тексту, вони повинні екрануватися знайомих \.
Наприклад, якщо в тексті у вас повинен знаходитися знак питання, він позначається як \?

. - даному регулярному виразу відповідає послідовність від 5 до 10 будь-яких символів, крім розриву рядків. Його можна використовувати для обрізки тексту до потрібної довжини, парсинга подстрок певної довжини, а так само для вказівки потрібної кількості невідомого набору символів у тексті.

а \ d + а - у випадках, коли між шуканим текстом, який відомий, є числа, що складаються з різної кількості знаків. Даному регулярному виразу відповідає А1А. а23а. а459а і так далі.

а [2-5] а - це регулярний вираз візьме текст, який буде починатися на "а" і містити усередині від 2 до 4 цифр 2, 3, 4 або 5 і закінчуватиметься на "а". Наприклад, а354а або а52а

Наприклад, вам необхідно взяти url сайту з наступного рядка id = "123" a href = "www.site.com">. де номер id завжди змінюється, а просто в тезі a href знаходяться і інші урли, які не потрібні.
Тестер регулярних виразів видасть нам такий варіант:

але йому будуть відповідати за виключенням окремих виразів, айди яких дорівнює «123». Оскільки нам потрібно вказати, що замість 123 може бути будь-яка послідовність цифр, ми замінюємо їх на \ d + і отримуємо наступне регулярний вираз

яке отримає всі рядки, що містять будь-які айди.

Що стосується самого короткого збіги в регулярному виразі. Потрібно розуміти, що під самим коротким збігом розуміється частина тексту, яка починається і закінчується за умовою, заданому в регулярному виразі.


Якщо ми візьмемо рядок a href = "www.site.com"> a href = "www.site2.ru"> і застосуємо до неї регулярний вираз "(?<=a\ href=").*?\.ru(?=">) ". у відповіді ми отримаємо www.site.com "> a href =" www.site2.ru замість очікуваного «www.site2.ru»


Чому пошук видав нам не найкоротший збіг? Відбувається це тому, що регулярний вираз отримало з тексту першу частину, яка повинна йти перед шуканим текстом, тобто "A href =" ". Далі продовжив шукати до тих пір, поки не знайшло умова, за яким повинна закінчитися рядок, тобто" .ru ", після якого йде">


Для того, щоб цього уникнути, в даному випадку можна використовувати таку структуру регулярного виразу:

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

У разі ж, якщо в частині регулярного виразу може бути все, що завгодно - різної довжини різний текст, або ж він може взагалі бути відсутнім, можна в даному місці вставити послідовність «. *?»

Для вказівки того, що шукане значення починається з нового рядка і (або) закінчується в кінці рядка, підійде таке регулярний вираз:

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

У випадках, якщо ми шукаємо елемент на різних сайтах, і він може відображатися з різних регістром, наприклад: Рядок, СТРОКА, рядок. З точки зору машини ці три значення будуть різними, і знайдеться тільки те, яке прописано з урахуванням регістру.


Якщо потрібно підготувати регулярний вираз, яке знайде всі ці збіги, необхідно прописати

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

Якщо необхідно взяти текст з вебсторінки, пошти або файлу, то потрібно враховувати, що початок рядка, що позначається, як ^ - це тільки початок першого рядка тексту, а кінець рядка, що позначається як $ - це лише кінець останнього рядка.


Решта рядків в тексті мають переноси, тобто всі ці рядки закінчуються символом повернення каретки (\ r) а починаються символом нового рядка (\ n).

Для того, щоб позначити, що регулярний вираз має починатися і закінчуватися в межах одного рядка, ми можемо прописати умова АБО, яке позначається як вертикальний слеш - |
Регулярний вираз виглядає так:

Так само можна додатково використовувати модифікатор многострочного пошуку, який кожен рядок вважає, як нову:

У регулярному виразі можна вказати, що саме шукати, використовуючи оператор АБО наступним чином:

1 | 2 (що означатиме вибір 1 або 2.)

Таким чином, ми можемо перевіряти на сторінці наявність відразу кількох текстів.
Наприклад, Вам необхідно перевірити на сторінці фрази "Привіт", "Дякуємо за реєстрацію", "Вітаємо Вас", ми можемо об'єднати всі ці дані в одне регулярний вираз наступним чином:

Привіт | Cпасибо за реєстрацію | Вітаємо Вас

При такій побудові, перевірка наявності тексту на сторінці отримає один із зазначених варіантів.

У разі ж, якщо знак "АБО" необхідно використовувати не для всього регулярного виразу, як показано вище, а тільки для його частини, ця частина повинна перебувати всередині дужок. наприклад:

Дане регулярний вираз знайде фрази "Що Він робить." "Що вона робить." і "Що Вони роблять."

<.*?> - знайде все теги в шуканому тексті;

\ + #])? - отримає урли сайтів.


Дякую всім, хто осилив цю статтю, сподіваюся вона була корисна тим, хто прочитав її користувачам і стане в нагоді ще багатьом.