Регулярные выражения
Очень интересная тема, до которой у меня вечно не доходят руки. На практике почти не приходится использовать, но вещь безусловно полезная.
Для первого знакомства можно посмотреть видео Вебинар: Что такое регулярные выражения?
00:00 – 02:37 | Вступление. Повестка и цели вебинара. |
02:38 – 04:35 | История возникновения регулярных выражений |
04:36 – 10:54 | Что такое регулярные выражения? Определение. Пример пасинга лога |
10:55 – 14:37 | Синтаксис регулярных выражений. Обычные (литералы) и специальные символы. Экранирование специальных символов. |
14:38 – 17:09 | Наборы символов (классы); 5, [Aa] |
17:10 – 17:54 | Специальные метасимволы-сокращения. \d \D \s \S \w \W |
17:55 – 20:00 | Указание позиции в поиске: начало и конец строки, начало и конец слова |
20:01 – 20:24 | Группировка a(bc|b|x)cc |
20:25 – 27:30 | Последовательности . *, +, ? |
27:32 – 30:29 | Перебор “(a|c|z)” |
30:30 – 34:07 | Практические примеры. Как прочитать регулярное выражение? |
34:07 – 35:59 | Инструменты проверки регулярных выражений |
36:00 – 42:19 | Простые задачи, которые можно решить при помощи регулярных выражений: парсинг телефонных номеров, email, html тэгов |
42:20 – 47:36 | Примеры практического применения регулярных выражений. Найти все запущенные процессы по шаблону, все email адреса в файле. |
47:37 – 50:33 | Регулярные выражения в Notepad++ и Total Commander |
50:34 – 56:59 | Использование регулярных выражений в программировании: Python, Java, JavaScript |
57:00 – 59:14 | Применение регулярных выражений в автоматизации тестирования |
59:15 – 1:01:31 | Итоги. |
1:01:32 – 1:09:45 | Ответы на вопросы |
Я для себя выписал на память кое-то в виде неупорядоченных записей.
Регулярные выражения — это язык поиска и манипуляций с подстроками в тексте. По сути это строка-образец, состоящая из символов и метасимволов и задающая правило поиска.
Порой сложно задать нужную строку для поиска. Склонения, окончания, регистр, изменяемая часть выражения и другие причины.
Удобно работать с большим текстом.
В http://regexr.com/ пишем онлайн регулярное выражение, и нам сразу показывается, где эти строки.
^.*(WARN|ERROR).*\((.*):(\d=)\)$ $1 in class $2 in line $33
Просто этим строчками меняем текст логов в удобный текст.
Обычный текст ищем как есть.
Есть спецсимволы, например, @, который также доступен для поиска.
Экранирование
Есть специальные символы, которые используются в регулярных выражениях, поэтому их не получится искать. К ним относятся
Их следует экранировать, т.е. поставить обратный слеш (\).
Для чего же он нужен? Рассмотрим простой пример. У нас есть строка с несколькими предложениями, в которых нам необходимо найти точки. Если вы попробуете это сделать, то будут выделены все символы. Дело в том, что точка является специальным метасимволом, которая заменяет любой символ в регулярном выражении, кроме переноса строки (см. ниже).
Нам следует указать, что точка в нашем случае должна быть не метасимволом, а обычным символом-точкой (\.). Экранируя любой метасимвол, мы превращаем его в обычный символ. Это относится и к самому обратному слешу, для экранирования используем \\.
Метасимвол точка
Точка заменяет любой символ в регулярном выражении. Если задать точку в регулярном выражении, то будут выделены все символы: буквы, цифры, пробел, точка, запятая и т.д. При этом точка совпадает с одним символом, но благодаря модификатору g поиск не ограничивается первым совпадением и продолжается дальше.
Создайте пример из трёх строк. Если мы добавим квантификатор + после точки (.+), то тем самым зададим поиск совпадающих символов от одного до бесконечности.
Обратите внимание, что регулярное выражение сообщит, что найдено три совпадения (по числу строк), а не количество всех символов, как это было бы без знака плюс.
Поскольку точка не совпадает с символом перевода строки, шаблон найдет совпадение до конца строки.
Мы знаем, что можно экранировать метасимвол точки, чтобы найти обычную точку.
Есть и другой способ — поместить точку в символьный класс, где она рассматривается как обычный символ: [.]+.
Использовать метасимвол точки полезно, когда есть строка с динамической составляющей, которая меняется. http://example.com/pictures/123/
Тогда для строки /pictures/123/, где числа 123 могут меняться, применим паттерн:
Мы экранировали слеши, ищем слово pictures, а также любые три символа (обязательно) после этого слова и слеша.
Наборы символов [Квадратные скобки]
Наборы символы позволяют задать определенные ограничения или диапазон. Например, если мы знаем, что будут выводиться только три цифры, то не обязательно использовать три точки, а можно сузить поиск. Для этого используются квадратные скобки, в которых указывается набор символов. Причем ищется только один символ.
Такой пример \/pictures\/2\/ будет находить строку /pictures/1/ (с одним символом), но не найдет /pictures/123/
Можно указать буквы [a-z] — любой символ алфавита.
Можно указывать не диапазон, а просто указать нужные символы. Например, [19] (напоминаю, только один символ)
Тогда \/pictures\/[19]\/ найдет варианты /pictures/1/ и /pictures/9/
Есть готовые сокращения для диапазонов
\9 1 цифры \D [^\d] не цифры \s [\f\n\r\t\v] пробельный символ \S [^\s] не пробельный символ \w [\da-zA-Z_] буквенный символ \W [^\w] не буквенный символ
Позиция
Если мы хотим найти какой-то конкретный текст, который заканчивается с определенным набором символов, то используется символ $
Рыжик - это кот. Рыжик - это кот кот по имени Рыжик.
Тогда выражение кот$ найдет слово только во второй строке. В первой в конце есть точка. В третьей слово начинается, а не заканчивается.
Для поиска строк, которые начинаются на определенное слово используется символ ^. Выражение ^кот найдет слово в третьей строке.
Символ \b определяет границу слова, \B — не границу слова.
Например, выражение [A-Z] будет находить все заглавные буквы. В том числе по два символа в словах TextView, StatusBar, EditText
Если использовать \b[A-Z] то ищутся символы, которые является границей слова. Т.е. будет находить первые заглавные буквы в указанных словах. Соответственно, \B[A-Z] наоборот найдет вторые заглавные буквы в этих словах.
Группировка (Круглые скобки)
Напомню, что круглые скобки являются метасимволами, поэтому их нужно экранировать, если вы ищете круглые скобки в тексе.
В основном удобна для замены. Допустим мы ищем какое-то слово. Помещаем его в круглые скобки, таким образом мы определили группу. Это простейший вариант.
Допустим, нас интересует слово gray. Можно просто написать это слово целиком в качестве шаблона. Однако слово gray часто пишут несколько как grey. Это также допустимый вариант.
Как же нам указать, что могут два варианта, которые нас интересуют? Вот здесь и пригодятся круглые скобки, которые произведут необходимую группировку.
Мы можем таким образом создать несколько групп. При этом они нумеруются. Первая группа будет доступна в переменной под номером один — $1, вторая — $2 и т.д.
Создадим две группы. Теперь мы можем манипулировать этими группами. Для этого используем $1 и $2 для ссылки к этим группам. Тогда запись $2 $1 поменяет слова местами в тексте (режим Replace).
Для примера возьмём строку.
Кот, который гулял сам по себе
Теперь строка должна быть:
Кот, который сам по себе гулял
Можно использовать back reference, если мы знаем, что текст в группе повторяется. Тогда можно не писать (cat)(cat), а заменить на (back)\1
Последовательности
Последовательности задаются фигурными скобками.
Если использовать [A-Z] то найдутся большие заглавные буквы, но один раз. А выражение [A-Z] указывает, что нужно показать все повторяющиеся символы от 1 до 4 раз. Можно указать точное значение [A-Z] — найдет слова, где идут именно три заглавные буквы подряд.
До четырех символов [A-Z]
От четырех символов [A-Z]
Существует сокращения для них *, +, ?
* — ноль или более символов
+ — один или более символов
? — ноль или один символ
^.*слово$ — такое выражение найдет целую строку, которое заканчивается на слово.
Перебор
TExT|TEXT — найдет два варианта слова, которые написаны в разных регистрах. | — это или. Как вариант TE(x|X)T — третий символ мы определили в двух вариантах.
Читать регулярные выражения
В круглых скобках идет набор символов. В квадратных скобках идет набор цифр от 0 до 9, который может повториться один раз. Дальше пробел, бесконечное количество символов. Потом снова пробел. Потом идут четыре цифры подряд, которые обязательно являются концом строки. Например.
044 - 1234 asdf 123 asdf 1234 ^[tT]ele\d$
Крышка — начало строки. Далее маленькая или большая буква T. Дальше три литерала. В конце строки должна быть цифра. Пример.
([mM]y name is|I am)\s[Mm]ykhailo [Pp]oliarush
My name is Mykhailo Poliaruhs I am mykailo Poliaruhs
Задачи
Телефонный номер 066.225-23-23
Три цифры, точка обязательно, три цифры, тире, две цифры, тире, две цифры.
Как вариант, можно было написать
parse http: http://host.com/parameters
Как добавить знаки [., :; !? /] в регулярное выражение?
Как добавить знаки:
точка, запятая, двоиточие, точка с запятой, восклицательный знак, вопрос, косая черта
в эти регулярные выражения
1 первое проверяет строку на наличие других знаков
(допустимы только англ символы цифры и пробел)
2 второе удаляет ненужные знаки
(оставляет только англ и русские буквы, цифры и пробел)
//1 preg_match('/^[a-zA-Z0-9\s]+$/', $a) //2 preg_replace('/[^a-zA-ZА-Яа-я0-9\s]/u', '', $b )
preg_match(‘/^[a-zA-Z0-9\.\,\:\;\/\s]+$/’, $a)
я пробовал так, но не работает.
двоиточие, если оно в конце строки было, срабатывало. а если в середине строки — нет
видимо нужно как то иначе добавлять
вот тут я нашел, тут отдельные квадратные скобки поставили, но я не могу понять остальных символов, и как это все объединить
Как добавить знаки к выборке регулярного выражения?
k-2, не знаю, что у вас не работает. Приведите пример строки для которой не работает эта регулярка.
P.S. Запятая, двоеточие и точка с запятой не являются спецсимволами в регулярках, их можно не экранировать.
вот эти строки не проходят
DanKud, посмотрите этот вопрос. там почему то в отдельных квадратных скобках эти символы вписали Как добавить знаки к выборке регулярного выражения?
k-2, все эти строки подходят под вашу регулярку — https://regex101.com/r/UWdFV7/1
В том посте, на который вы даете ссылку, используется логическое «или» — символ |
Напишите конкретно, что вам нужно. Я просто не понимаю какого результаты вы хотите добиться.
вот этот код у меня пробегается по переводу и создает словарь, из которого, если нет перевода, я подставляю подходящие фразы. я вначале добавил только буквы и пробел. но оказалось что часто в строках попадаются разные символы. и поэтому мне их нужно как то добавить в регулярку
k-2, регулярка в условии preg_match(‘/^[a-zA-Z0-9:\s]+$/’,$EN[$keyR]) у вас будет выдавать true при наличии в строке любого из указанных символов. Такая регулярка preg_match(‘/^[a-zA-Z0-9\. ;\/\s]+$/’,$EN[$keyR]) тоже будет работать и искать соответствующие символы.
Попробуйте так же убрать начало и конец строки, тут это особо роли не играет: preg_match(‘/[a-zA-Z0-9\. ;\/\s]+/’,$EN[$keyR])
Вторая регулярка соответственно так же должна работать в таком виде:
preg_replace('/[^a-zA-ZА-Яа-я0-9\. ;\/\s]/u', '', strip_tags($valR))