Egrep примеры регулярных выражений: Основы Linux от основателя Gentoo. Часть 2 (1/5): Регулярные выражения / Хабр
Регулярные выражения
Основные технологии создания и использования регулярных выражений на UNIX-системах
Михаэль Штутц
Опубликовано 06.11.2007
Концепция регулярных выражений (regexps) — обозначений для описания шаблонов, соответствующих набору строк — является общей для множества программ и языков программирования. Различные реализации регулярных выражений отличаются друг от друга в деталях, но принципы, необходимые для обучения созданию регулярных выражений, одинаковы во всех их реализациях.
Эта статья рассматривает несколько полезных инструментальных средств и приемов для обучения созданию и улучшению регулярных выражений для ряда приложений UNIX®, таких как:
Маркировка совпадений в зависимости от их контекста
При создании регулярного выражения нелишней будет возможность видеть, какие строки сопоставляются с образцом в текущем наборе данных. Рассмотрите этот текст, состоящий из четырех строк в примере 1 и простейшее регулярное выражение t[a-z]
которое находит соответствие для двухсимвольного шаблона.
Пример 1. Текст из четырех строк и регулярное выражение, которое ищет в них совпадения
$ cat midsummer I know a bank where the wild thyme blows, Where oxlips and the nodding violet grows, Quite over-canopied with luscious woodbine, With sweet musk-roses and with eglantine. $ grep t[a-z] midsummer I know a bank where the wild thyme blows, Where oxlips and the nodding violet grows, Quite over-canopied with luscious woodbine, With sweet musk-roses and with eglantine. $
Так как регулярное выражение находит по крайней мере одно совпадение с образцом в каждой строке, команда grep
записывает каждую строчку во входной файл. Но для каких именно символов из строк найдено совпадение с регулярным выражением?
Для такого простого регулярного выражения как это, вы можете и сами уверенно сразу ответить на этот вопрос. Но когда создано запутанное регулярное выражение и оно работает с большими наборами данных или входными файлами, будет гораздо труднее труднее понять, какая строка или строки будут поставлены в соответствие с регулярным выражением. Очень полезно иметь возможность видеть для каждой строки какой именно текст в ней совпал с образцом в регулярном выражении. Способ увидеть результат работы регулярных выражений — промаркировать их, когда они будут возвращать результаты.
Вы можете осуществить это с помощью нескольких приложений, включая grep
, sed
и Emacs.
Маркирование при помощи grep
Некоторые из новейших версий grep
(такие как GNU grep
) отмечают цветом регулярное выражение, когда вы используете опцию --color
, как показано на рисунке 1.
Рисунок 1. Выделенные цветом совпавшие подстроки в grep
Если ваш дисплей цветной, полезно посмотреть как точно строки совпали с образцом регулярного выражения.
Маркирование при помощи sed
Вы также можете маркировать регулярное выражение при помощи потокового редактора sed
. Команда sed
:
's/regexp/[&]/g'
Она заключает в квадратные скобки все совпадения с образцом, отмеченные регулярным выражением. Пример 2 показывает результаты работы sed на несложном тексте.
Пример 2. Совпадения строк, отмеченные sed
$ sed 's/t[a-z]/[&]/g' midsummer I know a bank where [th]e wild [th]yme blows, Where oxlips and [th]e nodding violet grows, Qui[te] over-canopied wi[th] luscious woodbine, Wi[th] sweet musk-roses and wi[th] eglan[ti]ne. $
Естественно, что вы можете выделить результаты работы регулярного выражения и другим путем. Если вводимые данные являются документом традиционной машинописной системы Groff, также можно добавить поддержку жирного шрифта к регулярному выражению и передать документ команде groff
на выполнение:
$ sed 's/t[a-z]/\\fB&\\fP/g' infile.roff | groff -
Также можно написать короткую sed
-программу, чтобы отметить удачные сопоставления цветом. Если ваша оболочка поддерживает управляющие последовательности, вы можете отметить цветом все регулярные выражения в контексте файла. Ввиду того, что управляющие последовательности являются громоздкими для ручного ввода, вы несомненно захотите запустить их при помощи скрипта, как показано в
примере 3.
Пример 3. sed-программа, которая выделяет цветом совпавшие с образцом строки
#!/bin/sh # highlights regexp pattern in input file # usage: hre regexp file sed 's/'$1'/^[[34m&^[[37m/g' < $2
Символ ^[
, который дважды появляется в примере, является символом управляющей последовательности, поэтому вам надо вводить этот пример в редакторе, который поддерживает ввод литеральных символов — например Emacs (где для ввода символа управляющей последовательности вам надо ввести C-q ESC
). Числа 34
и 37
являются кодами интерпретатора Bash для задания голубого и и белого цветов.
Чтобы сделать скрипт выполняемым, напечатайте:
$ chmod 744 hre
Потом запустите его, как показано на рисунке 2.
Рисунок 2. Совпавшие подстроки выделены цветом при помощи sed
Хотя вы можете определить цвет выделения (маркирования) текста и простые цвета с помощью этого метода, существуют предостережения к его использованию. Например, скрипт, показанный в примере 3, работает только тогда, когда простой текст в окне терминала белого цвета, потому что он восстанавливает этот цвет текста. Если ваш терминал использует другой цвет для отображения простого текста, поменяйте в скрипте управляющий код. (Например, 30
— это черный.)
Выделение цветом с помощью Emacs
В новейших версиях редактора Emacs функции isearch-forward-regexp
и isearch-backward-regexp
выделяют все совпадения в буфере. Если у вас стоит последняя версия Emacs, попробуйте выполнить эти функции сейчас:
- Запустите Emacs, напечатав:
$ emacs midsummer
- Введите следующее:
M-x isearch-forward-regexp
.Последовательность
M-x
— это условный знак Emacs для Meta-x, который вы можете ввести в большинстве систем либо нажав и удерживая клавиши Alt, одновременно нажав X, а затем отпустив обе клавиши, либо нажав клавишу Esc, отпустив ее, и затем нажав клавишу X. - Создайте регулярное выражение типа:
t[a-z]
Ввиду того, что поиск инкрементый, Emacs начинает маркировать совпадения как только вы напечатаете единственный символ: в этом случае, когда при нажатии клавиши T, все символы T в буфере выделяются. Заметьте, что как только вы начинаете печатать что-либо, заключая содержимое в скобки, маркирование исчезнет и Emacs выведет отчет в средство minibuffer о том, что у него недостаточно входных данных для отобрженияя удачных сопоставлений.
Результаты вашей работы с Emacs должны выглядеть примерно так, как на рисунке 3.
Рисунок 3. Буфер Emacs показывает регулярное выражение для текущей задачи
- Введите
C-x C-c
чтобы выйти из Emacs.Вы вводите эту комбинацию путем нажатия и удерживания клавиши Ctrl и однократного нажатия X, повторного нажатия и удерживания Ctrl с одновременным нажатием клавиши C.
Функциям isearch-forward-regexp
и isearch-backward-regexp
обычно соотвествуют комбинации M-S-s
и M-S-r
. (Чтобы создать их, нажмите и удерживайте клавишу Alt, Ctrl и либо клавишу S либо клавишу R.)
Отображение только совпадений, а не строк целиком
Есть другой подход к проблеме контекста образца, который состоит только в том, чтобы выводить только совпадения сами по себе, а не строки, где было найдено это совпадение, целиком. Существует несколько способов чтобы сделать это с помощью grep
, sed
, и perl
.
Отображение только совпадений при помощи grep
Флаг --only-matching
(или по-другому -o
) изменяет поведение grep
так, что команда выводит не целиком строки, в которых нашлись совпадения с шаблоном регулярного выражения, а только сами совпадения. Вместе с флагом --color
, описанным выше, эта возможность появилась в новейших реализациях некоторых версий grep
, включая GNU grep
, у которого открытый исходный код и который доступен для многих операционных систем.
Итак, этот флаг предназначен для сбора данных, которые удовлетворяют условию в регулярном выражении, поэтому он идеально подходит для сбора IP-адресов, URL-ссылок, имен, адресов электронной почты, и т.п., но помимо всего прочего это еще и отличный способ получить регулярные выражения. Например, пример 4 показывает как использовать этот флаг, чтобы получить все слова из исследуемого текста из примера 1. Он выводит каждое слово в отдельную строку.
Пример 4. Сбор всех слов из текста
$ egrep -o '[A-Za-z]+' midsummer I know a bank where the wild thyme blows Where oxlips and the nodding violet grows Quite over canopied with luscious woodbine With sweet musk roses and with eglantine $
Фактически, когда вы создаете в высокой степени запутанное регулярное выражение для конкретной задачи, использование этого флага является простейшим способом протестировать регулярное выражение, чтобы убедиться, что оно постороено корректно. В большинстве случаев, это дает возможность заблаговременно скорректировать работу регулярного выражения.
Допустим, нужно вывести все слова из текстового файла, содержащие строку th
, и вы создали регулярное выражение для реализации этого, как показано в примере 5.
Пример 5. Вывод всех слов, содержащих th. Первая попытка
$ egrep -o 'th[a-z]*' midsummer the thyme the th th th $
Регулярное выражение не работает. Видно, что некоторые из результатов, выведенных регулярным выражением, вообще не являются словами. Лучше попробуйте заново: пример 6 учитывает также любые символы в словах, которые могут предшествовать th
.
Пример 6. Выводим все слова с th. Вторая попытка
$ egrep -o '[a-z]*th[a-z]*' midsummer the thyme the with ith with $
Уже гораздо лучше, но пока еще не идеальный результат. Строчка th говорит о том, что регулярное выражение не воспринимает верхний регистр, когда ищет совпадения со своим образцом. Исправьте это при помощи флага -i
, как показано в примере 7.
Пример 7. Вывод всех слов, содержащих th. Третья попытка
$ egrep -o -i '[a-z]*th[a-z]*' midsummer the thyme the with With with
Теперь то, что надо!
Использование флага -o
и каких-нибудь тестовых данных для проверки регулярного выражения очень полезно при их создании, так как можно предположить что регулярное выражение работает должным образом, но в то же время и не знать, что есть случаи, которые оно не охватывает и не может корректно провести сопоставление.
Отображение только совпадений с использованием sed
Вы можете делать вещи, как в прошлом пункте, уже с использованием команды sed
:
s/.*\(regexp\).*/\1/p
Эта команда выводит только совпавшие с образцом символы из вводимых данных, а не строки, которые содержат совпадения, целиком, но отображается последнее совпадение в строке, как показано в примере 8.
Пример 8. Вывод только совпавших символов при помощи sed
$ sed -n 's/.*\(th[a-z]\).*/\1/p' midsummer thy the $ grep -o th[a-z] midsummer the thy the $
Отображение только совпадений с Perl
Регулярные выражения также активно используются в языке программирования Perl, но регулярные выражения в Perl отличны от тех, что вы строили при помощи команды grep
. Инструментальное средство pcretest
позволяет протестировать регулярные выражения в Perl. Можно использовать этот инструментарий, чтобы ознакомится с Perl-совместимой библиотекой регулярных выражений (PCRE), и для того, чтобы отладить или протестировать регулярные выражения, которые были созданы с помощью этого инструментального средства.
Обычно регулярное выражение заключается в символы-слэши (/) и сопровождается модификаторами, которые вносят изменения в механизм поиска. Наиболее распространенные модификаторы регулярных выражений представлены в таблице 1.
Таблица 1. Распространненые модификаторы регулярных выражений для инструментального средства pcretest
Модификатор | Описание |
---|---|
8 | Этот модификатор добавляет поддержку символов Unicode (UTF-8). |
g | Этот модификатор ищет глобальные совпадения (больше чем по одному на строку). |
i | Этот модификатор позволяет игнорировать регистр символов. |
m | Этот модификатор дает возможность поиска на нескольких строках. |
x | Этот модификатор использует расширенные регулярные выражения Perl. |
Попробуйте запустить pcretest
, как показано на рисунке 9.
Рисунок 9. Тестирование ваших регулярных выражений при помощи pcretest
$ pcretest PCRE version 6.7 04-Jul-2006 re> /[a-z]*th[a-z]*/ig data> With sweet musk-roses and with eglantine. 0: With 0: with data> $
Также можно запустить pcretest
с входным файлом, который содержит регулярное выражение, которое надо протестировать на одной только строке или совокупности строк. У вас могут быть составные регулярные выражения и образцы для сравнивания, тогда они должны быть отделены друг от друга пустой строкой. pcretest
продолжает искать совпадения для образца регулярного выражения во входных данных до тех пор, пока он не достигнет конца файла (EOF).
Если вы предоставите pcretest
имя второго файла, то он будет выводить результаты в него. В противном случае он осуществляет стандартный вывод, как показано в примере 10.
Пример 10. Запуск pcretest с входным файлом
$ cat midsummer.pre /w[hi]|th/gi I know a bank where the wild thyme blows, Where oxlips and the nodding violet grows, Quite over-canopied with luscious woodbine, With sweet musk-roses and with eglantine. $ pcretest midsummer.pre PCRE version 6.7 04-Jul-2006 /w[hi]|th/gi I know a bank where the wild thyme blows, 0: wh 0: th 0: wi 0: th Where oxlips and the nodding violet grows, 0: Wh 0: th Quite over-canopied with luscious woodbine, 0: wi 0: th With sweet musk-roses and with eglantine. 0: Wi 0: th 0: wi 0: th $
Использование мастера создания регулярных выражений
txt2regex является интерактивным кросс-платформенным мастером для создания регулярных выражений для интерпретатора Bash. Когда вы его запускаете, он задает ряд вопросов об образце, с которым нужно искать совпадения и затем создает корректное регулярное выражение для любого из двух дюжен различных приложений:
awk
;ed
;egrep
;emacs
;expect
;find
;gawk
;grep
;javascript
;lex
;lisp
;mawk
;mysql
;ooo
;perl
;php
;postgres
;procmail
;python
;sed
;tcl
;vbscript
;vi
;vim
.
Кроме того, что txt2regex помогает интерактивно создавать регулярные выражения, он предоставляет краткое изложение синтаксиса регулярных выражений для различных языков и приложений, список уже готовых регулярных выражений для сопоставления наиболее общих образцов и удобную таблицу метасимволов, используюемых при составлении регулярных выражений.
Создание регулярного выражения
Чтобы создать регулярное выражение для одного или более поддерживаемых txt2regex приложений, разделяйте имена этих приложений запятой. И используйте этот список в качестве аргумента к флагу --prog
.
Начните с попытки создания регулярного выражения как в разделе Выделенные цветом совпадения, которое ищет совпадения для символа Т, прямо за которым следует буква в нижнем регистре:
- Запустите txt2regex и определите регулярные выражения для
grep
,sed
, и Emacs:$ txt2regex --prog grep,sed,emacs
- Вы хотите искать совпадения для буквы Т в любой части строки, а не только в ее начале, поэтому введите
2
для выбора условия «в любой части строки». - Введите
2
снова для выбора опции «конкретный символ» и затем введитеt
, когда будут запрошено, для какого именно символа искать совпадения.Теперь вам следует ответить на вопрос сколько совпадений вам надо найти.
- Введите
1
, чтобы точно определить максимум совпадений, которые надо найти. - Для сопоставления букв нижнего регистра, введите
6
чтобы выбрать «особую комбинацию символов» и затем введитеb
для сопоставления букв нижнего регистра. Введите.
для выхода в главное меню txt2regex. - Для сопоставления букв нижнего регистра только один раз введите
1
.
После того как вы полностью определите, какое регулярное выражение вам нужно, txt2regex создаст регулярное выражение для каждого из трех выбранных приложений и отобразит их в верхней части экрана. Итак, после того как вы точно определились с желаемой функциональностью регулярного выражения, можно увидеть его в версиях для всех трех приложений на рисунке 4.
Рисунок 4. Создание регулярного выражения при помощи txt2regex
Введите ..
для выхода. Список регулярных выражений останется на вашем терминале.
Да, вышло так, что все три регулярных выражения одинаковы t[a-z]
, но это только потому, что у нас достаточно простое регулярное выражение и три выбранных приложения имеют единый синтаксис для регулярных выражений. И далеко не всегда регулярные выражения будут одинаковы для всех трех выбранных приложений.
Скажем, например, необходимо создать два регулярных выражения по образу регулярных выражений из раздела
Как показать только сами совпадения, а не строку целиком. Первое представляло слово, состоящее из букв верхнего или нижнего регистра:
- Запустите txt2regex без каких-либо флагов:
$ txt2regex
- Введите
2
для поиска совпадений в любой части строки. - Введите
6
чтобы задать специальную комбинацию и затем введитеa
иb
для выбора всех букв вернего или нижнего регистра. - Введите
.
для возвращения в главное меню а затем введите4
чтобы определить, что нужно искать одно или более совпадений.
Без флагов, то есть по умолчанию, txt2regex создаст регулярные выражения для следующих приложений и языков:
perl
, php
, postgres
, python
,
sed
, and vim
. Когда вы пройдете все этапы, описанные выше, при создании регулярного выражения, обнаружится, что первые четыре приложения используют теже регулярные выражения, что были использованы с grep
в примере 4, но регулярные выражения для sed
и vim
отличаются друг от друга незначительно. Это потому, что эти приложения используют несколько разные наборы метасимволов, как будет описано ниже.
И снова введите ..
для выхода из программы; регулярные выражения для различных программ останутся на вашем терминале. Вы можете использовать их такими или улучшать их дальше. Например, как насчет поиска совпадений для слов, содержащих символ апострофа (‘) —don’t, who’re, e’er, owner’s, ’cause, Joe’s и тому подобных? Регулярное выражение, которое вы создали только что, не сможет корректно сопоставлять такие слова (см. пример 11).
Пример 11. Неправильное сопоставление слов с апострофом
$ echo "Don't miss a word, just 'cause it's wrong." | egrep [A-Za-z]+ Don t miss a word just cause it s wrong $
Вам надо добавить символ апострофа к списку в квадратных скобках. Результат работы регулярного выражения показан в примере 12. Обратите внимание, что сейчас регулярное выражение заключено в кавычки.
Пример 12. Правильное сопоставление слов с апострофом
$ echo "Don't miss a word, just 'cause it's wrong." | egrep "[A-Za-z']+" Don't miss a word just 'cause it's wrong $
Следующее регулярное выражение, котороерассматривалось в разделе Как показать только сами совпадения, а не строку целиком было для одиночных слов, содержащих в любой своей части сочетание символов th. Вы использовали регулярные выражения для
egrep
, sed
, и perl
; теперь попробуем создать его для grep
:
- Запустите txt2regex:
$ txt2regex
- Введите
/
для выбора доступных программ и введитеhkopqstx.
. Таким образом будет создано регулярное выражение только дляgrep
. - Введите
26ab.3
для возможности поиска нужного сочетания букв верхнего или нижнего регистра где угодно в строке. - Введите
2t12h2
для задания символов, которым искать совпадения — T и H, следующими друг за другом, причем это сочетание, TH, встречается только один раз в слове. - Введите
6ab.3
для возможности поиска последовательности букв th; любого регистра. - Введите
..
для выхода из программы.
Вы можете протестировать построенное регулярное выражение, как показано в примере 13.
Пример 13. Сопоставление слов, содержащих th при помощи grep
$ grep -o [A-Za-z]*th[A-Za-z]* midsummer the thyme the with With with $
Краткие сведения об опциях регулярных выражений
Опция (флаг) --showinfo
выводит краткую сводку информации о создании регулярных выражений конкретно для какого-либо языка или программы. $
\t in [] YES
[:POSIX:] YES
$
Получение готовых регулярных выражений
Опция --make
описана своим автором как a remedy for headaches (лекарство от головной боли). Оно выводит регулярные выражения для одного из нескольких общих образцов, которые задаются как параметры. Список готовых регулярных выражений показан в таблице 2.
Таблица 2. Список готовых регулярных выражений, предоставляемых txt2regex
Аргумент | Описание |
---|---|
date | Этот параметр соответствует дате в формате mm/dd/yyyy с диапазоном от 00/00/0000 до 99/99/9999. |
date2 | Этот параметр соответствует дате в формате mm/dd/yyyy с диапазоном от 00/00/1000 до 19/39/2999. |
date3 | Этот параметр соответствует дате в формате mm/dd/yyyy с диапазоном от 00/00/1000 до 12/31/2999. |
hour | Этот параметр соответствует времени в формате hh:mm в диапазоне от 00:00 до 99:99. |
hour2 | Этот параметр соответствует времени в формате hh:mm в диапазоне от 00:00 до 29:59. |
hour3 | Этот параметр соответствует времени в формате hh:mm в диапазоне от 00:00 до 23:59. |
number | Этот парамеир соответствует любому положительному или отрицательному целочисленному значению. |
number2 | Этот параметр соотвествует любому положительному или отрицательному целому числу с дополнительными разрядами после запятой. |
number3 | Этот параметр соответствует положительному или отрицательному целому числу с дополнительными запятыми и дополнительным значением после запятой. |
Например, вы можете использовать эти параметры чтобы получить готовое регулярное выражение для работы с военным временем, как показано в примере 15.
Пример 15. Получение регулярного выражения для работы со временем от txt2regex
$ txt2regex --make hour3 RegEx perl : ([01][0-9]|2[0123]):[012345][0-9] RegEx php : ([01][0-9]|2[0123]):[012345][0-9] RegEx postgres: ([01][0-9]|2[0123]):[012345][0-9] RegEx python : ([01][0-9]|2[0123]):[012345][0-9] RegEx sed : \([01][0-9]\|2[0123]\):[012345][0-9] RegEx vim : \([01][0-9]\|2[0123]\):[012345][0-9] $
Список метасимволов
Другой полезной возможностью txt2regex является опция --showmeta
, которая выводит таблицу, содержащую все метасимволы, используемые при построении регулярных выражений для поддерживаемых приложений и языков. Работа этой опции показана в примере 16.
Пример 16. Отображение всех метасимволов при помощи txt2regex
$ txt2regex --showmeta awk + ? | () ed \+ \? \{\} \| \(\) egrep + ? {} | () emacs + ? \| \(\) expect + ? | () find + ? \| \(\) gawk + ? {} | () grep \+ \? \{\} \| \(\) javascript + ? {} | () lex + ? {} | () lisp + ? \\| \\(\\) mawk + ? | () mysql + ? {} | () ooo + ? {} | () perl + ? {} | () php + ? {} | () postgres + ? {} | () procmail + ? | () python + ? {} | () sed \+ \? \{\} \| \(\) tcl + ? | () vbscript + ? {} | () vi \{1\} \{01\} \{\} \(\) vim \+ \= \{} \| \(\) NOTE: . ] and * are the same on all programs. $
Изучение документов
Изучение руководств приносит пользу. У вашей системы должно быть море документации, включая справочную систему man, про создание и использование регулярных выражений.
Например, синтаксис создания регулярных выражений к grep
, sed
и других инструментальных средств подобного типа, а также примеры к этим регулярным выражениям описаны в справоной системе man. Если у вас установлены GNU-версии этих приложений, то у них также должны быть справочные системы, содержащие даже больше информации, чем стандартная справочная система man. Например, если у вас установлен GNU sed
и у вас есть файл справки info
, вы можете прочитать руководство:
$ info sed
Документация к Perl (обычно посталяется отдельно от основного комплекта поставки Perl) содержит всестороннюю оперативную страницу руководства по регулярным выражениям в Perl:
$ man perlre
И даже больше! Оперативная страница руководства man для pcrepattern
(поставляемая с приложениемpcretest
, как описано выше) также является руководством по регулярным выражениям в Perl.
В заключение, оперативная страница руководства man по regex
, доступная на многих UNIX-системах, предоставляет информацию о создании регулярных выражений, поддерживающих интерфейсы POSIX. Информация в этой оперативной странице памяти взята из библиотеки регулярных выражений Генри Спенсера (Henry Spencer’s regex
library) (см. дополнительную информацию).
Заключение
Множество инструментальных средств и методов доступны на UNIX-системах для создания регулярных выражений. Вы ознакомились с лучшими из них.
Эти инструментальные средства предоставляют прекрасные возможности для создания, тестирования и улучшения регулярных выражений. Использование этих инструментальных средств и приемов в UNIX-системах возможно лучший путь, чтобы научиться создавать сложные регулярные выражения.
Ресурсы для скачивания
Похожие темы
- Know your regular expressions:
ознакомьтесь с оригиналом статьи (EN). - «Hone your regexp pattern-building skills»
(Michael Stutz, developerWorks, июль 2006): эта статья описывает несколько регулярных выражений для системного администрирования, которые вы, возможно, найдете полезными для себя. - Speaking UNIX, Part 9: Regular expressions (EN)
(Martin Streicher, developerWorks, апрель 2007): эта статья представляет собой короткий учебник для начинающих создавать регулярные выражения. - Ознакомьтесь с другими статьями, написанными Михаэлем Штутцом (Michael Stutz):
- Разделы библиотеки информации по AIX и UNIX:(EN)
- Podcasts: оставайтесь на связи с техническими экспертами IBM.(EN)
- GNU Project Web site: загрузите бесплатную копию GNU
grep
для вашей операционной системы.(EN) - PCRE: загрузите бесплатную копию PCRE.(EN)
- txt2regex script: загрузите бесплатную копию программы txt2regex.(EN)
- regex: загрузите бесплатную копию библиотек регулярных выражений Генри Спенсера (Henry Spencer’s regular expression libraries).(EN)
Утилита grep в ОС Linux
Команда grep (Global Regular Expression Print – глобальный поиск по регулярному выражению с печатью результатов) выполняет построчный анализ текста и выводит строки, соответствующие заданному шаблону.
Синтаксис
grep [ОПЦИИ] ШАБЛОН [ФАЙЛ]
Ниже предоставлены основные опции утилиты.
-b — показывать номер блока перед строкой
-c — Отключает стандартный способ вывода результата и вместо этого отображает только число обозначающее количество найденых строк.
-h — не выводить имя файла в результатах поиска внутри файлов Linux
-i — не учитывать регистр
-l — отобразить только имена файлов, в которых найден шаблон
-n — показывать номер строки в файле
-s — не показывать сообщения об ошибках
-v — инвертировать поиск, выдавать все строки кроме тех, что содержат шаблон
-w — Ведет поиск по цельным словам. Например при обычном поиске строки ‘wood’ grep может найти слово ‘hollywood’. А если используется данный ключ то будут найдены только строки где есть слово ‘wood’
-e — использовать регулярные выражения при поиске
-An — показать вхождение и n строк до него
-Bn — показать вхождение и n строк после него
-Cn — показать n строк до и после вхождения
-o — показать только совпадающие (непустые) части совпадающей строки, каждая из которых находится в отдельной строке.
-P — Интерпретировать шаблон как регулярное выражение Perl. Это экспериментально, и grep -P может предупредить о невыполненных функции.
-r — Производит поиск рекурсивно по всем поддиректориям.
Обзор
grep выполняет поиск соответствий регулярному выражению (ШАБЛОН) по тексту в файле, нескольких файлах или потоке ввода (если имя не указано или вместо него указан один минус («-»). Найденные совпадения выводятся на терминал.
Пример использования
Допустим, требуется быстро найти фразу «our products» в HTML-файлах на компьютере. Начнем с поиска в одном из них. В данном случае ШАБЛОН – это «our products», а ФАЙЛ – product-listing.html
$ grep "our products" product-listing.html <p>You will find that all of our products are impeccably designed and meet the highest manufacturing standards available <em>anywhere. </em> </p> $
Была найдена одна строка, содержащая указанный шаблон, и grep выводит всю соответствующую строку на терминал. Строка длиннее ширины окна терминала, поэтому текст переносится на следующие строки, но данный вывод соответствует ровно одной строке в файле.
Важно: ШАБЛОН интерпретируется grep как регулярное выражение. В рассмотренном выше примере все использованные символы (буквы и пробел) интерпретируются в регулярных выражениях буквально, поэтому выполняется только поиск точной фразы. Однако, у других символов, например, некоторых знаков препинания, может быть особое значение.
Выделение цветом
При использовании опции –color найденные совпадения будут выделены цветом:
$ grep –-color "bla bla" listing.txt You will find that all of bla bla are impeccably designed and meet the highest manufacturing standards available $
Просмотр номеров строк, содержащих совпадения
Еще полезнее может быть информация о месторасположении строки с совпадением в файле. Если указать опцию –n, grep перед каждой содержащей совпадение строкой будет выводить ее номер в файле:
$ grep –-color -n "bla bla" listing.txt 18:You will find that all of bla bla are impeccably designed and meet the highest manufacturing standards available
Перед содержащей соответствие строкой выведено «18:», что соответствует 18-й строке.
Выполнение поиска без учета регистра
Допустим, фраза «string search» расположена в начале предложения или набрана в верхнем регистре. Для поиска без учета регистра можно указать опцию –i:
$ grep –-color –n -i "string search" listing.txt 18:<p>You will find that all of string search are impeccably designed and meet the highest manufacturing standards available <em>anywhere. </em> </p> 23:<p>String search are manufactured using only the finest top-grain leather.</p> $
С опцией -i grep находит также совпадение в строке 23.
Поиск в нескольких файлах по маске
Для поиска в нескольких файлах можно использовать маску в аргументе . Например, вместо имени файла listing.txt можно указать звездочку («*») и расширение .txt. При выполнении команды оболочка будет распространять звездочку на все имена файлов (в текущей директории) с расширением «.txt».
$ grep –-color –n -i "tu tu" *.txt product-details.txt:27:<p><b>TU TU</b></p> product-details.txt:59:<p class=”products-searchbox”>To search a comprehensive list of tu tu type your search term in the box below and click the magnifying glass</p> product-listing.txt:18:<p>You will find that all of tu tu are impeccably designed and meet the highest manufacturing standards available <em>anywhere. </em> </p> product-listing.txt:23:<p>Tu tu are manufactured using only the finest top-grain leather.</p> product-overview.txt:30:<p>To learn more about tu tu please email us at the link below.</p> $
В начале каждой строки указано имя файла, содержащего совпадение.
Рекурсивный поиск по поддиректориям
Поиск можно расширить по поддиректориям и всем файлам, которые они содержат, при помощи опции –r, которая предписывает grep выполнять поиск рекурсивно. Заменим наш аргумент на одну звездочку («*»), чтобы поиск выполнялся не только по TXT-файлам, а по всем файлам и директориям:
$ grep –-color –n –i -r "string search" * product-details.html:27:<p><b>STRING SEARCH</b></p> xml/dynamic-content.xml:29:<page01 ref=”prods_01_a” ref coord=”83,12,17”<![CDATA[<p>Click here to email us about string search.</p>]]></ page01> $
В результате мы нашли еще три совпадения. Для содержащих совпадения файлов вне текущей директории выводится также имя директории.
Использование регулярных выражений
Истинная сила grep заключается в возможности применения для поиска соответствий регулярным выражениям. В регулярных выражениях в аргументе ШАБЛОН используются специальные символы для охвата более широкого диапазона строк. Рассмотрим простой пример.
Допустим, требуется найти каждое появление фразы, похожей на «our products», которая всегда должна начинаться с «our» и заканчиваться на «products». Для этого нужно указать такой шаблон: «our.*products».
В регулярных выражениях точка («.») интерпретируется как маска для одного символа. Она означает «подойдет любой символ на этом месте». Звездочка («*») означает «подойдет предыдущий символ в количестве от нуля и более». Таким образом, комбинация «.*» означает, что подойдет любой символ в любом количестве. Например, «our amazing products», «ours, the best-ever products» и даже «ourproducts» будут соответствовать выражению. А так как указана опция –i, ему будут соответствовать также «OUR PRODUCTS» и «OuRpRoDuCtS». При запуске команды с этим регулярным выражением мы получим дополнительные совпадения:
$ grep –-color –n -i «our.*products» *.html product-details.html:27:<p><b>OUR PRODUCTS</b></p> product-details.html:59:<p class=”products-searchbox”>To search a comprehensive list of our products type your search term in the box below and click the magnifying glass</p> product-replacement.html:58:<p>If you experience dissatisfaction with any of our fine products, do not hesitate to contact us using the form below.</p> $
Была найдена фраза «our fine products».
Grep – мощный инструмент работы с текстовыми файлами. При умелом использовании регулярных выражений он предоставляет еще более широкие возможности. Здесь рассмотрены наиболее типичные примеры использования команды. Другие опции командной строки можно узнать, запустив команду с опцией —help.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Grep OR — Grep AND — Grep NOT — Несколько Условий
Самыми распространенными утилитами для парсинга файлов в Linux являются команды grep
, egrep
, sed
и awk
.
Из данной статьи вы узнаете, как выполнить поиск строк в файле по нескольким условиям, которые задаются логическими операторами OR
, AND
, NOT
с помощью grep
, egrep
, sed
и awk
из командной строки в Linux.
Я приведу примеры того, как найти все строки в файле, соответствующие любому из нескольких условий (регулярных выражений), строки которые соответствуют каждому из перечисленных условий, а также как напечатать файл, исключив строки попадающие под указанное условие.
Дельный Совет: Поиск и валидация email адресов с помощью команды grep
! Лучшее регулярное выражение для поиска email адресов! Читать далее →
GREP OR: Любое Из Нескольких Условий
Поиск строк в файле, в которых содержится любое из перечисленных регулярных выражений.
Используя команду grep
и egrep
:
$ grep "ВЫРАЖЕНИЕ1\|ВЫРАЖЕНИЕ2" FILE $ grep -E "ВЫРАЖЕНИЕ1|ВЫРАЖЕНИЕ2" FILE $ grep -e ВЫРАЖЕНИЕ1 -e ВЫРАЖЕНИЕ2 FILE $ egrep "ВЫРАЖЕНИЕ1|ВЫРАЖЕНИЕ2" FILE
Используя команду awk
:
awk '/ВЫРАЖЕНИЕ1|ВЫРАЖЕНИЕ2/' ФАЙЛ
Используя команду sed
:
sed -e '/ВЫРАЖЕНИЕ1/b' -e '/ВЫРАЖЕНИЕ2/b' -e d ФАЙЛ
GREP AND: Каждое Из Условий
Также, очень часто возникает необходимость grep
-нуть файл по нескольким условиям — это когда нужно найти все строки в файле, которые соответствуют каждому из нескольких регулярных выражений.
Обратите внимание, что вы можете осуществить поиск строк в файле которые содержат регулярные выражения, как в определенном, так и в произвольном порядке.
Используйте одну из приведенных ниже команд, чтобы найти и напечатать все строки в файле, которые соответствуют нескольким условиям.
Используя команду grep
(в такой последовательности):
$ grep -E 'ВЫРАЖЕНИЕ1.*ВЫРАЖЕНИЕ2' ФАЙЛ
Используя команду grep
(в любой последовательности):
$ grep -E 'ВЫРАЖЕНИЕ1.*ВЫРАЖЕНИЕ2|ВЫРАЖЕНИЕ2.*ВЫРАЖЕНИЕ1' ФАЙЛ $ grep 'ВЫРАЖЕНИЕ1' ФАЙЛ | grep 'ВЫРАЖЕНИЕ2'
Дельный Совет: На сервере закончилась память? Узнайте какой процесс съел всю RAM и SWAP! Одна строка на Bash для настоящих Linux админов! Читать далее →
Используя команду awk
(в такой последовательности):
$ awk '/ВЫРАЖЕНИЕ1.*ВЫРАЖЕНИЕ2/' ФАЙЛ
Используя команду awk
(в любой последовательности):
$ awk '/ВЫРАЖЕНИЕ1/ && /ВЫРАЖЕНИЕ2/' ФАЙЛ
Используя команду sed
(в такой последовательности):
$ sed '/ВЫРАЖЕНИЕ1.*ВЫРАЖЕНИЕ2/!d' ФАЙЛ
Используя команду sed
(в любой последовательности):
$ sed '/ВЫРАЖЕНИЕ1/!d; /ВЫРАЖЕНИЕ2/!d' ФАЙЛ
GREP NOT: Исключение
Дельный Совет: Поиск и валидация IP адресов с помощью команды grep
! Лучшее регулярное выражение для поиска IP адресов Читать далее →
Поиск и печать строк из файла, которые не содержат указанное регулярное выражение.
Используя команду grep
:
grep -v 'ВЫРАЖЕНИЕ1' ФАЙЛ
Используя команду awk
:
awk '!/ВЫРАЖЕНИЕ1/' ФАЙЛ
Используя команду sed
:
sed -n '/ВЫРАЖЕНИЕ1/!p' ФАЙЛ
20 коротких шагов для освоения регулярных выражений. Часть 1
Оригинал этой статьи здесь.
Наверное, теории много не бывает, и я приведу несколько ссылок на более подробный материал по regex в конце статьи. Но, мне показалось, что начинать вникать в такую тему как регулярные выражения будет гораздо интереснее, если есть возможность заниматься не только зубрежкой, но и сразу закреплять знания, выполняя небольшие задания по ходу обучения.
Пожалуй приступим.
Обычно противники использования регулярных выражений (‘RegEx’ или просто ‘regex’) в программировании приводят следующую цитату, приписываемую Джейми Завински:
«Некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них две проблемы».
На самом деле, использование регулярных выражений еще не является хорошей или плохой идеей. И это само по себе не добавит проблем и не решит ни одну из них. Это всего-лишь инструмент. И то, как вы его используете (правильно или неправильно), определяет, какие результаты вы увидите.
Если вы попытаетесь использовать regex, например, для создания HTML-парсера, то вы, скорее всего, испытаете боль. Но если вы хотите просто извлечь, например, временные метки из некоторых строк, у вас, вероятно, будет все в порядке.
Чтобы облегчить вам освоение регулярных выражений, я собрал этот урок, который поможет вам с нуля овладеть регулярными выражениями всего за двадцать коротких шагов. Это руководство в основном фокусируется на основных понятиях регулярных выражений и углубляется в более сложные темы только по мере необходимости.
Шаг 1: для чего нужно использовать регулярные выражения
Регулярные выражения используются для поиска совпадений в тексте по заданным шаблонам (образцам).
При помощи regex мы можем легко и просто извлекать изюм из кекса слова из текста, а также отдельные литеральные (буквальные) и мета (специальные) символы и их последовательности, отвечающие определенным критериям.
Вот что говорит нам о них Википедия:
Регуля́рные выраже́ния (англ. regular expressions) — формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов (символов-джокеров, англ. wildcard characters).
Для поиска используется строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска. Для манипуляций с текстом дополнительно задаётся строка замены, которая также может содержать в себе специальные символы.
Шаблон может быть таким-же простым, как, например, слово dog
в этом предложении:
The quick brown fox jumps over the lazy dog.
Это регулярное выражение выглядит так:
dog
… Достаточно легко, неправда-ли?
Образцом может быть также любое слово, которое содержит букву o
.
Регулярное выражение для поиска такого шаблона может выглядеть так:
\w*o\w*
(Опробовать это регулярное выражение можно здесь),
Можно заметить, что по мере усложнения требований к «соответствию», регулярное выражение также усложняется.
Существуют дополнительные формы записи для указания групп символов и соответствия повторяющимся шаблонам, что я объясню ниже. Но, как только мы находим соответствие шаблону в каком-то тексте, то что-же мы можем с ним делать?
Современные движки регулярных выражений позволяют извлекать символы или их последовательности (подстроки) из содержащегося текста, или удалять их, или заменять их другим текстом. В общем, регулярные выражения используются для разбора и манипулирования текстом.
Мы можем извлечь, например, подстроки, которые выглядят как IP-адреса, а затем попытаться проверить их. Или мы можем извлечь имена и адреса электронной почты и сохранить их в базе данных. Или использовать регулярные выражения, чтобы найти конфиденциальную информацию
(например, номера паспортов или номера телефонов) в электронных письмах и предупредить пользователя о том, что он может подвергнуть себя риску. Regex действительно универсальный инструмент, который легко выучить, но трудно освоить:
«Точно так же, как есть разница между хорошим исполнением музыкального произведения и созданием музыки, есть и разница между знанием регулярных выражений и их пониманием».
— Джеффри Э. Ф. Фридл, Освоение регулярных выражений
Шаг 2: квадратные скобки []
Простейшие регулярные выражения, которые легко понять — это те, которые всего-лишь ищут соответствие по-символьно между шаблоном регулярного выражения и целевой строкой.
Давайте, например, попробуем найти кота:
pattern: cat string: The cat was cut when it ran under the car.
(Как это работает)
Когда вы используете квадратные скобки, вы указываете механизму регулярных выражений, чтобы он искал совпадения только с одним из символов, содержащихся в скобках. Движок находит символ c
, потом символ a
, но если следующий символ не r
или t
, то это еще не полное совпадение.
Если он находит ca
, а затем либо r
, либо t
, он останавливается. Он не будет пытаться сопоставить больше символов, потому что квадратные скобки указывают, что нужно искать только один из содержащихся символов. Когда он находит ca
, то следующим находит r
в слове cart
, и останавливается, потому что он уже нашел совпадение последовательности car
.
Задачи для тренировки:
Напишите регулярное выражение, которое находит все 10 совпадений с шаблонами had
и Had
в этом отрывке непереводимой игры слов на местном диалекте:
pattern: string: Jim, where Bill had had "had", had had "had had".
(Возможное решение)
Вот мы уже и научились писать более-менее сложные регулярные выражения, и мы только на шаге 2! Продолжаем!
Шаг 3: escape-последовательности
На предыдущем шаге мы узнали о квадратных скобках []
и о том, как они помогают нам найти альтернативные совпадения при помощи движка regex.
А что если мы хотим найти совпадения в виде самих открытых и закрытых квадратных скобок []
?
Когда мы хотели найти по-символьное совпадение со словом cat
, то мы предоставляли движку regex эту последовательность символов (cat
).
Давайте попробуем найти квадратные скобки []
таким же способом:
pattern: [] string: You can't match [] using regex! You will regret this! matches:
(Смотрим что получилось)
Что-то не сработало, однако… Это происходит потому, что символы квадратной скобки работают как специальные символы движка regex, которые обычно используются для обозначения чего-то иного, и не являются буквальным шаблоном для поиска их самих.
(Решение)
Шаг 7: классы символов
Классы символов даже проще, чем диапазоны символов. Различные движки регулярных выражений имеют разные доступные классы, поэтому здесь я расскажу только об основных. (Проверьте, какую версию regex вы используете, потому что их может быть больше — или они могут отличаться от показанных здесь.)
Классы символов работают почти как диапазоны, но при этом, вы не можете указать значения ‘start’ и ‘end’:
класс | символы |
---|---|
\d | «цифры» [0-9] |
\w | «символы слова» [A-Za-z0-9_] |
\s | «пробелы» [ \t\r\n\f] |
Класс символов \w
«word» особенно полезен, поскольку этот набор символов часто требуется для допустимых идентификаторов (имен переменных, функций и т.д.) в различных языках программирования.
Мы можем использовать \w
, чтобы упростить регулярное выражение, которое мы видели ранее:
pattern: \\[a-z] string: `\n`, `\r`, `\t`, and `\f` are whitespace characters, `\.
(Решение)
RegEx: 20 коротких шагов для освоения регулярных выражений. Часть 2.
20 коротких шагов для освоения регулярных выражений. Часть 3.
RegEx: 20 коротких шагов для освоения регулярных выражений. Часть 4.
Анализ текста регулярными выражениями (RegExp) в Excel
Одной из самых трудоемких и неприятных задач при работе с текстом в Excel является парсинг — разбор буквенно-цифровой «каши» на составляющие и извлечение из нее нужных нам фрагментов. Например:
- извлечение почтового индекса из адреса (хорошо, если индекс всегда в начале, а если нет?)
- нахождение номера и даты счета из описания платежа в банковской выписке
- извлечение ИНН из разношерстных описаний компаний в списке контрагентов
- поиск номера автомобиля или артикула товара в описании и т.д.
Обычно во подобных случаях, после получасового муторного ковыряния в тексте вручную, в голову начинают приходить мысли как-то автоматизировать этот процесс (особенно если данных много). Решений тут несколько и с разной степенью сложности-эффективности:
- Использовать встроенные текстовые функции Excel для поиска-нарезки-склейки текста: ЛЕВСИМВ (LEFT), ПРАВСИМВ (RIGHT), ПСТР (MID), СЦЕПИТЬ (CONCATENATE) и ее аналоги, ОБЪЕДИНИТЬ (JOINTEXT), СОВПАД (EXACT) и т.д. Этот способ хорош, если в тексте есть четкая логика (например, индекс всегда в начале адреса). В противном случае формулы существенно усложняются и, порой, дело доходит даже до формул массива, что сильно тормозит на больших таблицах.
- Использование оператора проверки текстового подобия Like из Visual Basic, обернутого в пользовательскую макро-функцию. Это позволяет реализовать более гибкий поиск с использованием символов подстановки (*,#,? и т.д.) К сожалению, этот инструмент не умеет извлекать нужную подстроку из текста — только проверять, содержится ли она в нем.
Кроме вышеперечисленного, есть еще один подход, очень известный в узких кругах профессиональных программистов, веб-разработчиков и прочих технарей — это регулярные выражения (Regular Expressions = RegExp = «регэкспы» = «регулярки»). Упрощенно говоря, RegExp — это язык, где с помощью специальных символов и правил производится поиск нужных подстрок в тексте, их извлечение или замена на другой текст. Регулярные выражения — это очень мощный и красивый инструмент, на порядок превосходящий по возможностям все остальные способы работы с текстом. Многие языки программирования (C#, PHP, Perl, JavaScript…) и текстовые редакторы (Word, Notepad++…) поддерживают регулярные выражения.
Microsoft Excel, к сожалению, не имеет поддержки RegExp по-умолчанию «из коробки», но это легко исправить с помощью VBA. Откройте редактор Visual Basic с вкладки Разработчик (Developer) или сочетанием клавиш Alt+F11. Затем вставьте новый модуль через меню Insert — Module и скопируйте туда текст вот такой макрофункции:
Public Function RegExpExtract(Text As String, Pattern As String, Optional Item As Integer = 1) As String On Error GoTo ErrHandl Set regex = CreateObject("VBScript.RegExp") regex.Pattern = Pattern regex.Global = True If regex.Test(Text) Then Set matches = regex.Execute(Text) RegExpExtract = matches.Item(Item - 1) Exit Function End If ErrHandl: RegExpExtract = CVErr(xlErrValue) End Function
Теперь можно закрыть редактор Visual Basic и, вернувшись в Excel, опробовать нашу новую функцию. Синтаксис у нее следующий:
=RegExpExtract( Txt ; Pattern ; Item )
где
- Txt — ячейка с текстом, который мы проверяем и из которого хотим извлечь нужную нам подстроку
- Pattern — маска (шаблон) для поиска подстроки
- Item — порядковый номер подстроки, которую надо извлечь, если их несколько (если не указан, то выводится первое вхождение)
Самое интересное тут, конечно, это Pattern — строка-шаблон из спецсимволов «на языке» RegExp, которая и задает, что именно и где мы хотим найти. Вот самые основные из них — для начала:
Паттерн |
Описание | |
. |
Самое простое — это точка. Она обозначает любой символ в шаблоне на указанной позиции. | |
\s |
Любой символ, выглядящий как пробел (пробел, табуляция или перенос строки). | |
\S |
Анти-вариант предыдущего шаблона, т.е. любой НЕпробельный символ. | |
\d |
Любая цифра | |
\D |
Анти-вариант предыдущего, т.е. любая НЕ цифра | |
\w |
Любой символ латиницы (A-Z), цифра или знак подчеркивания | |
\W |
Анти-вариант предыдущего, т. |
Начало строки |
$ |
Конец строки | |
\b |
Край слова |
Если мы ищем определенное количество символов, например, шестизначный почтовый индекс или все трехбуквенные коды товаров, то на помощь нам приходят квантификаторы или кванторы — специальные выражения, задающие количество искомых знаков. Квантификаторы применяются к тому символу, что стоит перед ним:
Квантор |
Описание |
? |
Ноль или одно вхождение. Например .? будет означать один любой символ или его отсутствие. |
+ |
Одно или более вхождений. Например \d+ означает любое количество цифр (т.е. любое число от 0 до бесконечности). |
* |
Ноль или более вхождений, т.е. любое количество. Так \s* означает любое количество пробелов или их отсутствие. |
{число} или {число1,число2} |
Если нужно задать строго определенное количество вхождений, то оно задается в фигурных скобках. Например \d{6} означает строго шесть цифр, а шаблон \s{2,5} — от двух до пяти пробелов |
Теперь давайте перейдем к самому интересному — разбору применения созданной функции и того, что узнали о паттернах на практических примерах из жизни.
Извлекаем числа из текста
Для начала разберем простой случай — нужно извлечь из буквенно-цифровой каши первое число, например мощность источников бесперебойного питания из прайс-листа:
Логика работы регулярного выражения тут простая: \d — означает любую цифру, а квантор + говорит о том, что их количество должно быть одна или больше. Двойной минус перед функцией нужен, чтобы «на лету» преобразовать извлеченные символы в полноценное число из числа-как-текст.
Почтовый индекс
На первый взгляд, тут все просто — ищем ровно шесть цифр подряд. Используем спецсимвол \d для цифры и квантор {6} для количества знаков:
Однако, возможна ситуация, когда левее индекса в строке стоит еще один большой набор цифр подряд (номер телефона, ИНН, банковский счет и т.д.) Тогда наша регулярка выдернет из нее первых 6 цифр, т.е. сработает некорректно:
Чтобы этого не происходило, необходимо добавить в наше регулярное выражение по краям модификатор \b означающий конец слова. Это даст понять Excel, что нужный нам фрагмент (индекс) должен быть отдельным словом, а не частью другого фрагмента (номера телефона):
Телефон
Проблема с нахождением телефонного номера среди текста состоит в том, что существует очень много вариантов записи номеров — с дефисами и без, через пробелы, с кодом региона в скобках или без и т.д. Поэтому, на мой взгляд, проще сначала вычистить из исходного текста все эти символы с помощью нескольких вложенных друг в друга функций ПОДСТАВИТЬ (SUBSTITUTE), чтобы он склеился в единое целое, а потом уже примитивной регуляркой \d{11} вытаскивать 11 цифр подряд:
ИНН
Тут чуть сложнее, т.к. ИНН (в России) бывает 10-значный (у юрлиц) или 12-значный (у физлиц). Если не придираться особо, то вполне можно удовлетвориться регуляркой \d{10,12}, но она, строго говоря, будет вытаскивать все числа от 10 до 12 знаков, т.е. и ошибочно введенные 11-значные. Правильнее будет использовать два шаблона, связанных логическим ИЛИ оператором | (вертикальная черта):
Обратите внимание, что в запросе мы сначала ищем 12-разрядные, и только потом 10-разрядные числа. Если же записать нашу регулярку наоборот, то она будет вытаскивать для всех, даже длинных 12-разрядных ИНН, только первые 10 символов. То есть после срабатывания первого условия дальнейшая проверка уже не производится:
Это принципиальное отличие оператора | от стандартной экселевской логической функции ИЛИ (OR), где от перестановки аргументов результат не меняется.
Артикулы товаров
Во многих компаниях товарам и услугам присваиваются уникальные идентификаторы — артикулы, SAP-коды, SKU и т.д. Если в их обозначениях есть логика, то их можно легко вытаскивать из любого текста с помощью регулярных выражений. Например, если мы знаем, что наши артикулы всегда состоят из трех заглавных английских букв, дефиса и последующего трехразрядного числа, то:
Логика работы шаблона тут проста. [A-Z] — означает любые заглавные буквы латиницы. Следующий за ним квантор {3} говорит о том, что нам важно, чтобы таких букв было именно три. После дефиса мы ждем три цифровых разряда, поэтому добавляем на конце \d{3}
Денежные суммы
Похожим на предыдущий пункт образом, можно вытаскивать и цены (стоимости, НДС…) из описания товаров. Если денежные суммы, например, указываются через дефис, то:
Паттерн \d с квантором + ищет любое число до дефиса, а \d{2} будет искать копейки (два разряда) после.
Если нужно вытащить не цены, а НДС, то можно воспользоваться третьим необязательным аргументом нашей функции RegExpExtract, задающим порядковый номер извлекаемого элемента. И, само-собой, можно заменить функцией ПОДСТАВИТЬ (SUBSTITUTE) в результатах дефис на стандартный десятичный разделитель и добавить двойной минус в начале, чтобы Excel интерпретировал найденный НДС как нормальное число:
Автомобильные номера
Если не брать спецтранспорт, прицепы и прочие мотоциклы, то стандартный российский автомобильный номер разбирается по принципу «буква — три цифры — две буквы — код региона». Причем код региона может быть 2- или 3-значным, а в качестве букв применяются только те, что похожи внешне на латиницу. Таким образом, для извлечения номеров из текста нам поможет следующая регулярка:
Время
Для извлечения времени в формате ЧЧ:ММ подойдет такое регулярное выражение:
После двоеточия фрагмент [0-5]\d, как легко сообразить, задает любое число в интервале 00-59. Перед двоеточием в скобках работают два шаблона, разделенных логическим ИЛИ (вертикальной чертой):
- [0-1]\d — любое число в интервале 00-19
- 2[0-3] — любое число в интервале 20-23
К полученному результату можно применить дополнительно еще и стандартную Excel’евскую функцию ВРЕМЯ (TIME), чтобы преобразовать его в понятный программе и пригодный для дальнейших расчетов формат времени.
Проверка пароля
Предположим, что нам надо проверить список придуманных пользователями паролей на корректность. По нашим правилам, в паролях могут быть только английские буквы (строчные или прописные) и цифры.) и концом ($) в нашем тексте находились только символы из заданного в квадратных скобках набора. Если нужно проверить еще и длину пароля (например, не меньше 6 символов), то квантор + можно заменить на интервал «шесть и более» в виде {6,}:
Город из адреса
Допустим, нам нужно вытащить город из строки адреса. Поможет регулярка, извлекающая текст от «г.» до следующей запятой:
Давайте разберем этот шаблон поподробнее.
Если вы прочитали текст выше, то уже поняли, что некоторые символы в регулярных выражениях (точки, звездочки, знаки доллара и т.д.) несут особый смысл. Если же нужно искать сами эти символы, то перед ними ставится обратная косая черта (иногда это называют экранированием). Поэтому при поиске фрагмента «г.» мы должны написать в регулярке г\. если ищем плюсик, то \+ и т.д.
Следующих два символа в нашем шаблоне — точка и звездочка-квантор — обозначают любое количество любых символов, т.е. любое название города.
На конце шаблона стоит запятая, т.к. мы ищем текст от «г.» до запятой. Но ведь в тексте может быть несколько запятых, правда? Не только после города, но и после улицы, дома и т.д. На какой из них будет останавливаться наш запрос? Вот за это отвечает вопросительный знак. Без него наша регулярка вытаскивала бы максимально длинную строку из всех возможных:
В терминах регулярных выражений, такой шаблон является «жадным». Чтобы исправить ситуацию и нужен вопросительный знак — он делает квантор, после которого стоит, «скупым» — и наш запрос берет текст только до первой встречной запятой после «г.»:
Имя файла из полного пути
Еще одна весьма распространенная ситуация — вытащить имя файла из полного пути. Тут поможет простая регулярка вида:
Тут фишка в том, что поиск, по сути, происходит в обратном направлении — от конца к началу, т.к. в конце нашего шаблона стоит $, и мы ищем все, что перед ним до первого справа обратного слэша. Бэкслэш заэкранирован, как и точка в предыдущем примере.
P.S.
«Под занавес» хочу уточнить, что все вышеописанное — это малая часть из всех возможностей, которые предоставляют регулярные выражения. Спецсимволов и правил их использования очень много и на эту тему написаны целые книги (рекомендую для начала хотя бы эту). В некотором смысле, написание регулярных выражений — это почти искусство. Почти всегда придуманную регулярку можно улучшить или дополнить, сделав ее более изящной или способным работать с более широким диапазоном вариантов входных данных.
Для анализа и разбора чужих регулярок или отладки своих собственных есть несколько удобных онлайн-сервисов: RegEx101, RegExr и др.
К сожалению, не все возможности классических регулярных выражений поддерживаются в VBA (например, обратный поиск или POSIX-классы) и умеют работать с кириллицей, но и того, что есть, думаю, хватит на первое время, чтобы вас порадовать.
Если же вы не новичок в теме, и вам есть чем поделиться — оставляйте полезные при работе в Excel регулярки в комментариях ниже. Один ум хорошо, а два сапога — пара!
Ссылки по теме
Урок 1. Знакомство с регулярными выражениями. Категория: Регулярные выражения
В этом уроке вы узнаете, что такое регулярные выражения и что они могут делать.
Назначение регулярных выражений
Регулярные выражения (regular expressions), или сокращенно regex — инструментальные средства, и подобно всем инструментальным средствам, регулярные выражения предназначены для решения очень конкретных проблем. Чтобы узнать, что такое регулярные выражения и что они делают, лучше всего познакомиться с проблемами, которые решаются с их помощью.
Рассмотрим следующие сценарии.
- Вы ищете файл, содержащий текст car (независимо от регистра), но не хотите указать местонахождение текста car — в середине, в начале или в конце слова (например, scar, carry и incarcerate).
- Вы динамически генерируете Web-страницу (используя сервер приложений) и должны отобразить текст, найденный в базе данных. Текст может содержать URL, и вы хотите, чтобы на сгенерированной странице URL можно было активизировать щелчком (так что вместо того, чтобы генерировать только текст, вы хотите сгенерировать правильный HTML-тег
<a href="...">...</a>
. - Вы создаете Web-страницу, содержащую форму. Форма запрашивает у пользователя разную информацию, включая и адрес электронной почты. Вы должны проверить, что указанные адреса имеют правильный формат (т.е. что они являются синтаксически правильными (допустимыми)).
- Вы редактируете исходный текст и должны заменить все вхождения слова size на iSize, но замену хотите выполнять только для слова size и не хотите заменять вхождения size там, где они выступают как часть другого слова.
- Вы отображаете список всех файлов в файловой системе компьютера и хотите отфильтровать этот список так, чтобы определить местонахождение только тех файлов, которые содержат текст Application.
- Вы импортируете данные в приложение. Данные разграничены знаками табуляции, и ваше приложение поддерживает файлы формата CSV (одна строка данных в строке текста, значения разделены запятыми, каждое значение можно заключить в кавычки).
- Вы должны найти в файле определенный текст, но только в определенном местоположении (например, в начале строки или в конце предложения).
Все эти сценарии представляют собой обычные программистские задачи. И все они могут быть решены почти на любом языке, в котором есть условные выражения и операции над строками. Но насколько сложно решить эти задачи? Вам понадобится в цикле перебирать слова или символы по одному, выполнять все типы условных операторов, отслеживать массу флажков, чтобы убедиться, что вы нашли то, что искали, или чтобы быть уверенными, что вы не нашли искомый текст, проверять всевозможные пробельные и специальные символы, и по ходу дела решить еще много подобных задач. И вы должны были бы сделать это все вручную.
Но вы можете использовать регулярные выражения. Каждая из предыдущих задач может быть решена с помощью подходящих инструкций, записанных в кратких строках, содержащих текст и специальные инструкции-команды, которые могут выглядеть следующим образом:
\b[Сс][Aa][Rr]\b
Не волнуйтесь, если не понимаете смысл предыдущей строки, — все это будет вскоре объясняться.
Как используются регулярные выражения
Просмотрите сценарии еще раз и обратите внимание, что все они относятся к одному из двух типов: либо отыскивается местонахождение информации (поиск текста), либо информация найдена и редактируется (выполняются замены). Фактически это и есть то, для чего используются регулярные выражения: поиск и замена. Каждое регулярное выражение либо ищет текст (выполняет операцию поиска) или ищет и заменяет текст (выполняет операцию замены).
Поиск с помощью регулярных выражений
Регулярные выражения используются для поиска тек¬ста, причем разыскиваемый текст может иметь разный вид, как при поиске саг в описанном ранее сценарии. Для начинающих отмечу, что задача может состоять в том, чтобы найти car
или CAR
или CaR
; это совсем простая часть (многие средства поиска способны выполнять поиск независимо от регистра). Более сложная часть состоит в том, чтобы гарантировать, что найденное вхождение car
не входит в scar
, carry
или incarcerate
. Некоторые более сложные редакторы имеют опции Match Only Whole Word
(Найти только слово целиком), но во многих эта опция отсутствует, и вы не можете делать такие замены в редактируемом документе. Решает проблему поиска использование регулярного выражения, а не просто текста car
.
Хотите знать, как решается эта задача? Вы фактически уже видели ее решение. Это пример инструкции, приведенный выше: \b[Cc][Aa][Rr]\b
.
Стоит заметить, что проверка на равенство (т.е. решение задачи вроде: соответствует ли указанный пользователем адрес электронной почты данному регулярному выражению?) и есть операция поиска. Выполняется операция поиска во всей введенной пользователем строке (а не операция поиска подстроки).
Замены с помощью регулярных выражений
Поиск с помощью регулярных выражений — очень мощное и очень полезное средство, причем совсем не трудно научиться применять его. Поэтому во многих уроках приводятся примеры выполнения операций поиска. Однако реальная польза регулярных выражений состоит именно в операциях замены, типа тех, что встречались в более раннем сценарии, в котором текстовый URL заменялся настоящим URL, активизирующимся щелчком мыши. Для начинающих отмечу, что для этого требуется определить местонахождение URL в тексте (возможно, для этого нужно выполнить поиск строк, которые начинаются с http://
или https://
и заканчиваются точкой, запятой или пробельным символом). Затем потребуется заменить найденный URL с двумя вхождениями найденной строки встроенным HTML-кодом так, чтобы
http://www.forta.com/
заменить на
<a href="http://www.forta.com/">http://www.forta.com/</a>
Опция Search and Replace
(Найти и заменить) в большинстве приложений не может выполнять операции замены такого типа, но решение этой задачи — невероятно простое регулярное выражение.
Так что же такое регулярное выражение?
Теперь, когда вы знаете, для чего используются регулярные выражения, дадим их определение. Попросту говоря, регулярные выражения — это строки, которые используются для поиска и обработки текста. Регулярные выражения записываются на языке регулярных выражений, т.е. на специализированном языке, разработанном и предназначенном для решения задач: поиска и замены текста. Подобно любому языку, язык регулярных выражений имеет специальный синтаксис и команды, которые вам предстоит освоить, и именно их вы будете изучать по данной книге.
Язык регулярных выражений — не полноценный язык программирования. Это обычно даже не программа или утилита, которую можно установить и использовать. Чаще всего регулярные выражения представляют собой миния-зыки, которые встроены в другие языки или программы. Хорошая новость состоит в том, что практически любой современный приличный язык или инструмент поддерживает регулярные выражения. Плохая новость в том, что сам по себе язык регулярных выражений не собирается искать что-нибудь подобно другим применяемым вами языкам или инструментам. Язык регулярных выражений — язык в себе, а совсем не интуитивно понятный язык для выполнения каких-либо очевидных операций.
Регулярные выражения возникли в научной работе по математике в 1950-х годах. Спустя годы принципы и идеи, заложенные в этой работе, пробились в мир Unix в язык Perl и в утилиты типа grep
. Много лет регулярные выражения (в предварительно подготовленных сценариях) использовались исключительно в семействе Unix, однако теперь регулярные выражения поддерживаются в самых разных формах почти на каждой вычислительной платформе.
Приведем примеры правильных (допустимых) регулярных выражений (их смысл вы вскоре поймете):
Ben
.
www\.forta\.com
[a-zA-Z0-9_.]*
\r\n\r\n
\d{3,3}-\d{3,3}-\d{4,4}
Важно уяснить, что синтаксис — самая простая часть в освоении регулярных выражений. Что действительно трудно, так это научиться применять этот синтаксис и разбивать задачи на подзадачи, решения которых находятся с помощью регулярных выражений. Этому нельзя научиться, просто читая книгу; подобно любому языку, вы овладеете языком регулярных выражений, выполняя разнообразные упражнения, а мастерство придет с практикой.
Использование регулярных выражений
Как уже отмечалось, для регулярных выражений нет никакой особой программы; это не приложение, которое вы выполняете, и не программное обеспечение, которое вы можете купить или загрузить. Совсем наоборот, язык регулярных выражений реализован в большом количестве программных изделий, языков, утилит и сред разработки.
То, как используются регулярные выражения и какие функциональные возможности регулярных выражений экспортируются, зависит от используемого вами приложения. Иногда в приложениях для применения регулярных выражений используются меню и диалоговые окна, а в некоторых языках программирования имеются функции или классы объектов, которые экспортируют функциональные возможности регулярных выражений.
Кроме того, не все реализации регулярных выражений одинаковы. Часто есть очень тонкие (а иногда и не очень тонкие) различия в синтаксисе и возможностях регулярных выражений.
Чтобы вам было легче освоить материал, вы можете загрузить приложение Regular Expression Tester (испытатель регулярных выражений) с Web-страницы этой книги (http://www.forta.com/books/0672325667/). Данное приложение имеет версии для использования в популярных серверах приложений и языках, а также прямо в JavaScript.
Перед началом
Прежде чем приступить к применению регулярных выражений, примите во внимание следующее.
- При использовании регулярных выражений почти всегда есть несколько решений любой задачи. Некоторые решения более просты, некоторые более быстрые, некоторые более удобны для переноса, а некоторые более удобны для обобщения. Редко есть один единственно правильный способ записи регулярного выражения (подразумевается, конечно, что при всех формах записи поставленная задача решается правильно).
- Как уже указывалось, существуют различия в реализации регулярных выражений. Насколько возможно, примеры и информация в уроках этой книги применимы ко всем главным реализациям, причем различия и несовместимости отмечаются особо.
- Как и для любого языка, ключ к освоению регулярных выражений — практика, практика и еще раз практика.
Резюме
Регулярные выражения — одно из самых мощных инструментальных средств обработки текстов. Язык регулярных выражений применяется для записи регулярных выражений (фактически, записанную строку и называют регулярным выражением), причем регулярные выражения используются для выполнения операций замены и поиска.
Используйте расширенные регулярные выражения с командой grep
В этом руководстве подробно объясняется, как использовать расширенные регулярные выражения с командой grep. Узнайте, что такое расширенные регулярные выражения и как они работают с командой grep, на практическом примере, который извлекает все ссылки из HTML-файла.
Расширенные регулярные выражения
Регулярное выражение — это шаблон поиска, которому команда grep соответствует в указанном файле или в предоставленном тексте. Чтобы позволить пользователю выражать регулярное выражение более индивидуально, grep придает особое значение нескольким символам.$. [] и * как символы Meta. Позже этот список пополнился еще несколькими персонажами. Это были ( ) { } ? + и |.
Основываясь на использовании метасимволов, регулярное выражение можно разделить на две категории; BRE (базовое регулярное выражение) и ERE (расширенное регулярное выражение).
Базовое регулярное выражение : — Выражение, в котором используются мета-символы по умолчанию.
Расширенное регулярное выражение : — Выражение, в котором используются добавленные позже метасимволы.
Как использовать расширенное регулярное выражение
Расширенное регулярное выражение использует метасимволы, которые были добавлены позже.
Поскольку добавленные позже символы не определены в исходной реализации, grep рассматривает их как обычные
символов, если мы не попросим его использовать их как мета-символы.
Чтобы указать команде grep использовать добавленные позже символы в качестве метасимволов, используется опция –E .
Возьмем пример. В исходной реализации вертикальная черта (|) определяется как обычный символ.
в то время как в новой реализации он определяется как метасимвол.
Если мы используем вертикальную черту без параметра –E , grep будет рассматривать его как обычный символ.
Но если мы используем его с опцией –E , grep будет рассматривать его как метасимвол.
Как мета-символ, он используется для поиска нескольких слов. Давайте поищем информацию о двух пользователях в файле / etc / passwd с опцией –E и без нее.
#grep "sanjay | rick" / etc / passwd #grep –E "санджай | рик" / etc / passwd
Без опции –E , grep искал шаблон как одно слово
sanjay | rick в файле / etc / passwd .В то время как с опцией –E ,
он разделил шаблон на два слова sanjay и rick и провел поиск по ним по отдельности.
grep расширенное регулярное выражение (поиск нескольких слов)
Знак вертикальной черты (|) используется для поиска нескольких слов с помощью команды grep.
Чтобы искать несколько слов с помощью команды grep, соедините их все знаком вертикальной черты
и окружить кавычками. Например, для поиска слов abc, fgh, xyz, mno и jkl используйте шаблон поиска «abc | fgh | xyz | mno | jkl» .>] +>. * ‘html_file
Давайте подробно разберемся с командой выше.
Параметры команды grep
-E : — Этот параметр указывает команде grep, что шаблон поиска содержит метасимволы, которые были добавлены позже.
o : — По умолчанию grep печатает всю строку, содержащую шаблон поиска. Этот параметр указывает команде grep
печатать только совпадающие слова вместо всей строки.
i : — Этот параметр требует от команды grep игнорировать регистр при сопоставлении с шаблоном.>] : — Соответствует всему, кроме > .
+ : — Матч, предшествующий одному или нескольким разам.
> : — Конечная точка тега привязки.
Пока в этой строке поиска говорится: ищите текст, который начинается с и содержит что-либо после него, кроме >
sing (, потому что этот знак используется для завершения тега, и нам нужны некоторые значения перед концом, иначе он станет
который не является допустимым тегом привязки ) и заканчивается знаком > .
За этой строкой следует метасимвол + , который указывает команде grep сопоставлять его один или несколько раз.
Метасимвол точка (.) представляет любой отдельный символ, а звездочка (*) представляет любое количество символов.
Мы использовали оба вместе для поиска любых символов между начальным и закрывающим тегом привязки.
: — Это закрывающая точка тега привязки.
В совокупности вышеупомянутые шаблоны поиска говорят о поиске текстовой строки, которая
начинается с
и снова содержит любое значение
и заканчивается на
На более простом языке any value ./ «] + 1> только ссылка
В приведенных выше командах
- Первая команда получает входные данные из файла с именем html_file , вторая команда первой получает свою форму ввода
command, а третья команда получает ввод от второй команды. - Первая команда извлекает все атрибуты привязки из html-файла и отправляет вывод второй команде вместо того, чтобы печатать его в командной строке.
- Вторая команда извлекает все теги href из вывода первой команды и отправляет вывод третьей команде.
- Третья команда извлекает все ссылки из вывода второй команды и сохраняет вывод в текстовый файл с именем только для ссылок.
На следующих рисунках показаны приведенные выше команды с выводом.
Вот и все для этого урока. Если вам нравится этот урок, не забудьте поделиться с друзьями через свой любимый социальный сайт.
Примеры регулярных выражений
Ниже вы найдете множество примеров шаблонов, которые вы можете использовать и адаптировать для своих целей.Ключевые методы, используемые при создании каждого регулярного выражения, объясняются со ссылками на соответствующие страницы в учебнике, где эти концепции и методы объясняются очень подробно.
Если вы плохо знакомы с регулярными выражениями, вы можете взглянуть на эти примеры, чтобы увидеть, что возможно.>] *> (.>] *> (. *?) \ 1> будет соответствовать паре открытия и закрытия любого тега HTML. Обязательно отключите чувствительность к регистру. Ключевым моментом в этом решении является использование обратной ссылки \ 1 в регулярном выражении. Все, что находится между тегами, записывается во вторую обратную ссылку. Это решение также не будет соответствовать тегам, вложенным в себя.
Обрезка пробелов
Вы можете легко обрезать ненужные пробелы от начала и до конца строки или строк в текстовом файле, выполнив поиск и замену регулярного выражения.[\ T] + | [\ t] + $. Вместо [\ t], который соответствует пробелу или табуляции, вы можете расширить класс символов до [\ t \ r \ n], если вы также хотите убрать разрывы строк. Или вместо этого вы можете использовать сокращение \ s.
Более подробные примеры
Числовые диапазоны. Поскольку регулярные выражения работают с текстом, а не с числами, сопоставление определенных числовых диапазонов требует некоторой дополнительной осторожности.
Сопоставление числа с плавающей запятой. Также иллюстрирует распространенную ошибку, когда все в регулярном выражении делают необязательными.
Соответствие адресу электронной почты. Существует много споров о том, какое регулярное выражение должно соответствовать адресам электронной почты. Это прекрасный пример, показывающий, что вам нужно точно знать, что вы пытаетесь сопоставить (а что нет), и что всегда существует компромисс между сложностью регулярного выражения и точностью.
Соответствие IP-адресу.
Соответствующие действительные даты. Регулярное выражение, которое соответствует 31 декабря 1999 г., но не 31 13 декабря 1999 г.
Поиск или проверка номеров кредитных карт. Подтвердите номера кредитных карт, введенные в форму заказа.Найдите номера кредитных карт в документах для проверки безопасности.
Соответствие полных строк. Показывает, как сопоставить полные строки в текстовом файле, а не только часть строки, которая удовлетворяет определенному требованию. Также показано, как сопоставить строки, в которых конкретное регулярное выражение соответствует , а не .
Удаление повторяющихся строк или элементов. Показывает простое, но разумное использование скобок или обратных ссылок.
Примеры регулярных выражений для обработки исходного кода. Как согласовать общий синтаксис языка программирования, такой как комментарии, строки, числа и т. Д.
Два слова рядом друг с другом. Показывает, как использовать регулярное выражение для имитации оператора «рядом», который есть в некоторых инструментах.
Общие ловушки
Катастрофический возврат. Если ваше регулярное выражение, кажется, занимает вечность или просто приводит к сбою приложения, скорее всего, это привело к катастрофическому возврату. Решение обычно состоит в том, чтобы конкретизировать то, что вы хотите сопоставить, чтобы количество совпадений, которые должна попытаться выполнить движок, не увеличивалось экспоненциально.
Сделать все необязательным.Если все части в вашем регулярном выражении являются необязательными, он будет соответствовать строке нулевой длины где угодно. Ваше регулярное выражение должно будет выражать факты о том, что разные части являются необязательными в зависимости от того, какие части присутствуют.
Повторение группы захвата по сравнению с захватом повторяющейся группы. Повторение группы захвата захватит только последнюю итерацию группы. Захватите повторяющуюся группу, если вы хотите зафиксировать все итерации.
Смешивание кодов Unicode и 8-битных символов. Использование 8-битных кодов символов, таких как \ x80, с механизмом Unicode и строкой темы, может дать неожиданные результаты.
Сделать пожертвование
Этот веб-сайт только что сэкономил вам поездку в книжный магазин? Сделайте пожертвование на поддержку этого сайта, и вы получите неограниченного доступа к этому сайту без рекламы!
Справочник по регулярным выражениям
Справочник по регулярным выражениям на этом веб-сайте действует как ссылка на весь доступный синтаксис регулярных выражений, так и как сравнение функций, поддерживаемых разновидностями регулярных выражений, обсуждаемыми в руководстве.Справочные таблицы содержат невероятное количество информации. Чтобы извлечь из них максимальную пользу, следуйте этой легенде, чтобы научиться их читать.
В таблицах по шесть столбцов для каждой функции регулярного выражения. Первые четыре объясняют эту функцию.
Feature | Имя функции, которая также служит ссылкой на соответствующий раздел в руководстве. |
---|---|
Синтаксис | Фактический синтаксис регулярного выражения для этой функции. Если синтаксис исправлен, он просто отображается как таковой.Если синтаксис имеет переменные элементы, синтаксис описывается. |
Описание | Краткое описание того, что делает функция. |
Пример | Функциональное регулярное выражение, демонстрирующее функцию. |
Последние два столбца показывают, поддерживают ли выбранные вами два варианта регулярного выражения именно эту функцию. Вы можете изменить вкусы, используя раскрывающиеся списки над таблицей. Есть много возможных индикаторов.
ДА | Все версии этого варианта поддерживают эту функцию. |
3.0 | Версия 3.0 и все более поздние версии этого варианта поддерживают эту функцию. Более ранние версии не поддерживают это. |
только 2.0 | Только версия 2.0 поддерживает эту функцию. Более ранние и более поздние версии не поддерживают его. |
2.0–2.9 | Только версии от 2.0 до 2.9 поддерживают эту функцию. Более ранние и более поздние версии не поддерживают его. |
Unicode | Эта функция работает с символами Unicode во всех версиях этого варианта. |
кодовая страница | Эта функция работает с символами на активной кодовой странице во всех версиях этого варианта. |
ASCII | Эта функция работает с символами ASCII только во всех версиях этого варианта. |
3.0 Unicode | Эта функция работает с символами Unicode в версиях 3.0 и более поздних версий этого аромата. Более ранние версии его вообще не поддерживают. |
3.0 Unicode 2.0 ASCII | Эта функция работает с символами Unicode в версиях 3.0 и более поздних версиях этого варианта. Он работает с символами ASCII в версиях от 2.0 до 2.9. Более ранние версии его вообще не поддерживают. |
3.0 Кодовая страница Unicode 2.0 | Эта функция работает с символами Unicode в версиях 3.0 и более поздних версиях этой разновидности. Он работает с символами активной кодовой страницы в версиях 2.От 0 до 2,9. Более ранние версии его вообще не поддерживают. |
строка | Тип регулярного выражения не поддерживает этот синтаксис. Но строковые литералы на языке программирования, с которыми обычно используется этот вариант регулярного выражения, действительно поддерживают этот синтаксис. |
3.0 1.0 строка | Версия 3.0 и более поздние версии этого варианта регулярного выражения поддерживают этот синтаксис. Более ранние версии разновидности регулярных выражений не поддерживают этот синтаксис. Но строковые литералы на языке программирования, с которыми обычно используется этот вид регулярных выражений, поддерживают этот синтаксис, начиная с версии 1.0. |
option | Все версии этого варианта регулярного выражения поддерживают эту функцию, если вы устанавливаете конкретную опцию или предшествуете ей определенным модификатором режима. |
option 3.0 | Версия 3.0 и все более поздние версии этого варианта регулярного выражения поддерживают эту функцию, если вы устанавливаете конкретную опцию или предшествуете ей модификатором определенного режима. Более ранние версии либо вообще не поддерживают синтаксис, либо не поддерживают модификатор режима для изменения поведения синтаксиса на то, что описывает функция. |
3.0 2.0 сбой | Версия 3.0 и все более поздние версии этого варианта регулярного выражения поддерживают эту функцию. Версия 2.0 все более поздние выпуски до 3.0 распознают синтаксис, но всегда не соответствуют этому токену регулярного выражения. Версии до 2.0 не поддерживают синтаксис. |
нет | Ни одна из версий этого варианта не поддерживает эту функцию. Нет никаких указаний на то, что на самом деле делает этот синтаксис. Тот же синтаксис может использоваться для другой функции, которая указана в другом месте справочной таблицы.Или синтаксис может вызвать ошибку, или он может быть интерпретирован как простой текст. |
н / д | Эта функция не применима к этому варианту регулярных выражений. Функции, описывающие поведение определенного синтаксиса, представленного ранее в справочной таблице, не имеют значения для разновидностей, которые вообще не поддерживают этот синтаксис. |
fail | Синтаксис распознается разновидностью, и регулярные выражения, использующие его, работают, но этот конкретный токен регулярного выражения всегда не соответствует.Регулярное выражение может находить совпадения только в том случае, если этот токен сделан необязательным путем чередования или квантификатора. |
Ошибка 2.0–2.9 | Версии от 2.0 до 2.9 распознают синтаксис, но всегда не соответствуют этому токену регулярного выражения. Более ранние и более поздние версии либо не распознают синтаксис, либо рассматривают его как синтаксическую ошибку. |
игнорируется | Синтаксис распознается разновидностью, но не делает ничего полезного. Этот конкретный токен регулярного выражения всегда находит совпадение нулевой длины. |
ошибка | Синтаксис распознается разновидностью, но обрабатывается как синтаксическая ошибка. |
Когда в этой легенде написано «все версии» или «без версии», это означает все или ни одну из версий каждой разновидности, которые охвачены справочными таблицами:
Для разновидности .NET некоторые функции обозначены «ECMA» или «не ECMA». Это означает, что функция поддерживается, только когда RegexOptions.ECMAScript установлен или не установлен. Функции, обозначенные с помощью «Unicode, отличного от ECMA», соответствуют символам ASCII, когда RegexOptions.ECMAScript и символы Unicode установлены, если RegexOptions.ECMAScript не установлен. Все, что применимо к .NET 2.0 или более поздней версии, также применимо к любой версии .NET Core. Visual Studio IDE использует версию .NET, отличную от ECMA, начиная с VS 2012.
Для разновидностей std :: regex и boost :: regex есть дополнительные индикаторы ECMA, basic, extended, grep, egrep и awk. Когда появляется один или несколько из них, это означает, что функция поддерживается только в том случае, если вы укажете одну из этих грамматик при компиляции регулярного выражения.Функции с индикаторами Unicode соответствуют символам Unicode при использовании std :: wregex или boost :: wregex в строках широких символов. В ссылке на заменяющую строку дополнительными индикаторами являются sed и default. Когда отображается одно из них, функция поддерживается только в том случае, если вы передаете или не передаете match_flag_type :: format_sed в regex_replace (). Для ускорения есть еще один индикатор замены «все», который указывает, что функция поддерживается только при передаче match_flag_type :: format_all в regex_replace ().
Для варианта PCRE2 некоторые функции замещающей строки обозначены как «расширенный». Это означает, что функция поддерживается только при передаче PCRE2_SUBSTITUTE_EXTENDED в pcre2_substitute.
Сделайте пожертвование
Этот веб-сайт только что сэкономил вам поездку в книжный магазин? Сделайте пожертвование на поддержку этого сайта, и вы получите неограниченного доступа к этому сайту без рекламы!
30 полезных инструментов и ресурсов для регулярных выражений
Регулярное выражение, или часто называемое регулярным выражением, — это шаблон, который состоит из правил, используемых для сопоставления определенного набора строк.Они чрезвычайно мощные, и они понадобятся вам на большинстве языков программирования, с которыми вы сталкиваетесь, особенно когда необходимо сканировать и сопоставлять контекст для дальнейших действий.
Вот простой пример регулярного выражения — чтобы соответствовать всей строке, состоящей из « регулярное выражение », « регулярное выражение », « регулярное выражение » и « регулярное выражение » в содержимом, это ваше регулярное выражение. шаблон — reg (улярное выражение? | ex (p | es)?)
Поначалу они могут показаться немного запутанными или трудными для понимания, но как только вы поймете синтаксис, вы заметите, что он довольно простой и определенно очень полезен для будущих проектов по программированию.Изучение и использование регулярных выражений не должно быть мучительным процессом.
Вот список полезных инструментов и ресурсов для регулярных выражений, которые сделают вашу жизнь проще.
Руководство для начинающих по регулярным выражениям (Regex)
Руководство по регулярным выражениям (Regex) для начинающих
Регулярное выражение — это набор символов, образующих шаблон, который можно искать в строке …. Подробнее
Desktop Regex Tools
regexИнструменты
Простое и понятное приложение RegEx для macOS для записи и проверки совпадений RegEx.
- Платформа: macOS
- Цена: Бесплатно
Узоры
Довольно обширное приложение для macOS для написания и тестирования RegEx. Он имеет подсветку синтаксиса в реальном времени для шаблона RegEx и совпадений. Он также поддерживает множество разновидностей RegEx, включая Perl (PCRE), Ruby, bash, grep и sed. Отличное приложение как для новичков, так и для опытных пользователей.
- Платформа: macOS
- Цена: 2 доллара.99
Маркер RegEx
Это приложение позволяет автоматизировать редактирование кода в XCode с помощью RegEx. С его помощью вы можете написать выражение, добавляете ли вы новую строку, заменяете или удаляете ее. Он совместим с XCode 10 и 9 в macOS Mojave или High Sierra.
- Платформа: macOS
- Цена: $ 4.99
Expresso
Expresso — отмеченный наградами редактор регулярных выражений, подходящий для начинающих регулярных выражений; он также имеет полнофункциональную среду разработки для программистов и веб-дизайнеров.
- Платформа: Windows
- Цена: Бесплатно
Регги
Приложение с открытым исходным кодом должно быть простым функциональным приложением с красивым пользовательским интерфейсом для macOS. Он поддерживает несколько разновидностей RegEx, включая Perl, Ruby и Java.
- Платформа: macOS
- Цена: Бесплатно
Regex Coach
Графическое приложение для Windows, которое можно использовать для интерактивных экспериментов с (совместимыми с Perl) регулярными выражениями.
- Платформа: Windows
- Цена: Бесплатно
Виджет Regex
Интерактивный виджет для тестирования регулярных выражений для JavaScript и других языков (таких как Sed, Ruby или Perl).
- Платформа: macOS
- Цена: Бесплатно
Регулярное выражение магии
Создает полные регулярные выражения в соответствии с вашими требованиями без необходимости иметь дело с синтаксисом регулярных выражений.
- Платформа: Windows
- Цена: 39.95 $
RegexPixie
Довольно функциональный инструмент для работы с RegEx в Windows. Он предлагает подсветку синтаксиса в реальном времени, поиск с заменой совпадений RegEx и поддержку «именованной группы» в RegEx.
- Платформа: Windows
- Цена: Бесплатно
Средство регулярных выражений Regex
Еще один удобный инструмент для Windows для написания и тестирования шаблона RegEx.Это работает довольно просто. Он имеет 3 входа, где вы можете добавить источник текста для тестирования, еще один вход для записи шаблона RegEx, а другой вход будет показывать совпадения RegEx в режиме реального времени.
- Платформа: Windows
- Цена: Бесплатно
Выражения
Приложение для macOS для игры с RegEx. Он имеет красивый минималистичный интерфейс, а также поддерживает темный режим macOS.
- Платформа: macOS
- Цена: долларов США7.99
Рекс-Т
Позволяет легко разрабатывать и тестировать сложные шаблоны регулярных выражений и сохранять их для дальнейшего использования. Он также может сгенерировать образец кода на основе шаблона для использования в коде Swift или Objective-C.
- Платформа: macOS
- Цена: USD1.99
Интернет-инструменты для регулярных выражений
RegExr
Созданный gskinner, это один из лучших онлайн-инструментов для работы с регулярными выражениями, которые мы когда-либо видели. Это разработано сообществом с полезными примерами синтаксиса регулярных выражений.Поддерживает соответствие и замену.
Регулярное выражение 101
Один из самых популярных и полнофункциональных онлайн-инструментов RegEx. Помимо ввода для тестирования.
Рубашка
Редактор регулярных выражений на основе Ruby. Удобный и простой способ проверить свои регулярные выражения в Интернете.
RegexTester
Этот сервис использует функции регулярных выражений PHP в качестве основы для своих операций. Это также может быть полезно для программистов других языков.
Рекс В
Средство оценки регулярных выражений на основе Ajax для трех различных систем регулярных выражений PHP PCRE, PHP Posix и Javascript.
Средство тестирования регулярных выражений Python
Один из веб-инструментов регулярных выражений Python для быстрого тестирования регулярных выражений. Включает поддержку специальных функций регулярных выражений Python, таких как dotall и unicode.
Ненавижу RegEx
Набор часто используемых выражений RegEx, подобных тем, которые соответствуют имени пользователя
, электронной почты
, телефонному номеру
с объяснением того, для чего соответствует каждое выражение. Экономия времени и отличный источник для изучения RegEx.
PHPLiveRegEx
Удобный инструмент для написания шаблона RegEx и тестирования с помощью функции PHP, такой как preg_match
, preg_match_all
и preg_replace
прямо из браузера.
Сборка RegEx
Удобно составлять выражение RegEx с помощью пользовательского интерфейса. Вы можете просто щелкнуть, выбрать условие и перетащить, чтобы изменить положение синтаксиса.
Регулекс
Инструмент, позволяющий визуализировать шаблон RegEx для JavaScript.Удобный инструмент, если вы собираетесь написать учебное пособие, книгу или презентацию.
Надстройки кода Visual Studio
VScode Regex
Надстройка, которая позволяет вам написать выражение RegEx и показать текущие совпадения в параллельном документе.
RegexWorkbench
Надстройка, которая запускает инструмент на собственном экране в Visual Studio Code для разработки и тестирования шаблона RegEx. Создан с помощью PCRE и в настоящее время поддерживает «сопоставить», «сопоставить все», «разбить», «заменить» и «заменить все».
grep учебник
Grep — это инструмент, появившийся в мире UNIX в 1970-х годах. Он может выполнять поиск в файлах и папках (каталогах в UNIX) и проверять, какие строки в этих файлах соответствуют заданному регулярному выражению. Grep выведет имена файлов и номера строк или фактические строки, соответствующие регулярному выражению. В общем, очень полезный инструмент для поиска информации, хранящейся где угодно на вашем компьютере, даже (или особенно), если вы действительно не знаете, где искать.
Использование grep
Если вы наберете grep regex * .txt, grep выполнит поиск по всем текстовым файлам в текущей папке. Он будет применять регулярное выражение к каждой строке в файлах и печатать (т. Е. Отображать) каждую строку, в которой было найдено совпадение. Это означает, что grep по своей сути основан на строках. Соответствие регулярным выражениям не может занимать несколько строк.
Если вам нравится работать в командной строке, традиционный инструмент grep облегчит множество задач. Все дистрибутивы Linux (за исключением крошечных дискет) по умолчанию устанавливают версию grep, обычно это GNU grep.Если вы используете Microsoft Windows, вам нужно будет загрузить и установить ее отдельно. Если вы используете инструменты разработки Borland, у вас уже установлен Borland Turbo GREP.
grep работает не только с глобальными файлами, но и со всем, что вы вводите на стандартный ввод. При использовании со стандартным вводом grep будет печатать все строки, которые он читает со стандартного ввода, которые соответствуют регулярному выражению. Например: команда find Linux найдет текущий каталог и распечатает имена всех найденных файлов, поэтому find | grep regex будет печатать только те имена файлов, которые соответствуют регулярному выражению.
Механизм регулярных выражений Grep
В большинстве версий grep используется механизм, управляемый регулярными выражениями, например разновидности регулярных выражений, обсуждаемые в руководстве по регулярным выражениям на этом веб-сайте. Однако возможности регулярных выражений grep очень ограничены. В системах POSIX он использует базовые регулярные выражения POSIX.
Расширенная версия grep называется egrep. Он использует текстовый движок. Поскольку ни grep, ни egrep не поддерживают какие-либо специальные функции, такие как ленивое повторение или поиск, и поскольку grep и egrep только указывают, было ли найдено совпадение в определенной строке или нет, это различие не имеет значения, за исключением того, что движок, ориентированный на текст быстрее.В системах POSIX egrep использует расширенные регулярные выражения POSIX. Несмотря на название «расширенный», egrep почти то же самое, что и grep. Он просто использует немного другой синтаксис регулярных выражений и добавляет поддержку чередования, но теряет поддержку обратных ссылок.
GNU grep, самая популярная версия grep в Linux, использует механизм, ориентированный как на текст, так и на регулярные выражения. Если вы используете обратные ссылки, он использует движок, ориентированный на регулярные выражения. В противном случае он использует более быстрый текстовый движок. Опять же, для задач, для которых предназначен grep, это не имеет значения для вас, пользователя.Если вы наберете команду «grep», вы будете использовать синтаксис основных регулярных выражений GNU. Если вы введете команду «egrep», вы будете использовать синтаксис расширенных регулярных выражений GNU. Версии GNU grep и egrep имеют точно такие же возможности, включая чередование для grep и обратные ссылки для egrep. Они используют только немного другой синтаксис.
Помимо командной строки
Если вам нравится работать в командной строке, то традиционный инструмент grep для вас. Но если вам нравится использовать графический пользовательский интерфейс, для Windows и других платформ доступно множество инструментов, подобных grep.Просто найдите «grep» на своем любимом сайте загрузки программного обеспечения. К сожалению, многие инструменты grep поставляются с плохой документацией, поэтому вам остается выяснить, какой именно вариант регулярного выражения они используют. Это не потому, что они заявляют о своей совместимости с Perl, а на самом деле. Некоторые из них почти идеально совместимы (но никогда не идентичны), но другие терпят неудачу, когда вы хотите использовать продвинутые и очень полезные конструкции, такие как lookaround.
Одним из инструментов grep на базе Windows, который выделяется из толпы, является PowerGREP.
Сделать пожертвование
Этот веб-сайт только что сэкономил вам поездку в книжный магазин? Сделайте пожертвование на поддержку этого сайта, и вы получите неограниченного доступа к этому сайту без рекламы!
R grep и регулярное выражение — EndMemo
R grep
Функция grep () ищет совпадения строки или вектора строки. Он возвращает вектор совпадающих элементов или их индексы.
grep (шаблон, x, ignore.case = FALSE, perl = FALSE, значение = FALSE, fixed = FALSE, useBytes = FALSE, invert = FALSE)
• шаблон
: строка для сопоставления, поддерживает регулярное выражение
• x
: строка или вектор строки
• игнорировать.case
: если FALSE, сопоставление с образцом чувствительно к регистру, а если TRUE, регистр игнорируется при сопоставлении.
• perl
: logic. Следует ли использовать Perl-совместимые регулярные выражения? Имеет приоритет перед расширенным
• фиксированным
: логическим. Если ИСТИНА, шаблон — это строка, которая должна быть сопоставлена как есть. Переопределяет все конфликтующие аргументы.
• useBytes
: logic. Если TRUE, сопоставление выполняется побайтово, а не посимвольно.
• инвертировать
: логический. Если TRUE возвращает индексы или значения для элементов, которые не соответствуют
grep (value = FALSE)
возвращает целочисленный вектор индексов
элементов x
, которые дали совпадение (или нет, для
инвертировать = ИСТИНА
).
> grep ("прямоугольник", "нарисовать прямоугольник") [1] 1 > ул х х
[1] 2 3
> х х х
[1] 1
• grep (value = TRUE)
возвращает вектор символов, содержащий
выбранные элементы размером x
(после принуждения, сохраняя имена, но не
другие атрибуты).
> grep ("rect", "рисовать прямоугольник", value = T) [1] "нарисовать прямоугольник" > х х
[1] «выражение» «примеры языка R»
• grepl
возвращает логический вектор (соответствует или нет для каждого элемента
х
).
> х х [1] ЛОЖЬ ИСТИНА ИСТИНА
R имеет различные функции для сопоставления и замены на основе регулярных выражений. Для поиска используются функции grep
, grepl
, regexpr
и gregexpr
для совпадений, а sub
и gsub
для выполнения замены.
• sub
и gsub
возвращают символьный вектор одного и того же
длины и с теми же атрибутами, что и x
(после возможных
принуждение к характеру).Элементы символьных векторов x
, которые
не заменяются, будут возвращены без изменений (включая любые заявленные
кодировка). Если useBytes = FALSE
результат замены не-ASCII
часто будет в UTF-8 с помеченной кодировкой (например, если есть
Ввод UTF-8 и в многобайтовой локали, если fixed = TRUE
).
> ул х х
[1] «Обычный» «eion» «примеры языка R»
> х х
[1] «Обычное» «ession» «e»
> х х х
[1] "строка: Ему сейчас лет, и весит фунты"
> х х х
[1] "строка: Ему сейчас лет, и весит фунты"
• regexpr
возвращает целочисленный вектор той же длины, что и
текст
, указывающий начальную позицию первого совпадения или
-1 , если его нет, с атрибутом "совпадение".длина "
, an
целочисленный вектор, определяющий длину совпадающего текста (или -1 для
не совпадает). Позиции и длина совпадений указаны в символах, если только
useBytes = TRUE
используется, если они указаны в байтах.
> ул х х
[1] -1 4 -1
• gregexpr
возвращает список той же длины, что и текст
каждый
элемент которого имеет ту же форму, что и возвращаемое значение для regexpr
,
за исключением того, что начальные позиции каждого (непересекающегося) совпадения
дано. ab]
Любой символ, кроме a и b
[A-Z]
Все прописные буквы от A до Z
[a-z]
Все строчные буквы от a до z
[A – z]
Все прописные и строчные буквы от a до z
i {n}
i встречается n раз в последовательности
i {n1, n2}
i встречается n1 — n2 раз в последовательности
я {n1, n2}?
Нежадное соответствие, см. Пример выше
i {n,}
i встречается> = n раз
[: alnum:]
Буквенно-цифровые символы: [: alpha:] и [: digit:]
[: alpha:]
Буквенные символы: [: lower:] и [: upper:]
[: blank:]
Пустые символы: e._ `{| } ~
[: space:]
Пробелы: табуляция, новая строка, вертикальная табуляция, подача страницы, возврат каретки, пробел
[: upper:]
Заглавные буквы в текущем языковом стандарте
[: xdigit:]
Шестнадцатеричные цифры: 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f
.