Использование регулярных выражений
Материал из LLUG.
1. Введение.
Регуляные выражения - набор символов, которые состоят из обычных символов и метасимволов (специальных символов). Также, регулярные выражения - шаблоны, которые являются образцом для поиска определенной строки. Такие шаблоны имеют большую значимость для использования их в поиске. Большинство программ умеют использовать регуляные выражения. Такие как sed, awk, procmail, grep, а также, некоторые текстовые редакторы, в том числе, и графические.
2. Символы.
Так из чего же состоят регулярные выражения и как можно написать свой шаблон? Как было сказано выше, выражения состоят из метасимволов и обычных символов. Метасимволы представляют собой символы, которые имеют определенные свойства. Они составляют основу шаблона. Когда встречается большое число метасимволов, то сам шаблон становится трудно читаемым и сложным. Даже опытные допускают ошибки при написании. Это еще раз подтверждает, что шаблоны нужно тестировать. И тестировать долго. Обычные символы (те, что не попадают в группу метасимволов) - различные символы, в виде букв и цифр, а также различных знаков.
3. Метасимволы.
Теперь я дам описание метасимволам и их свойствам.
* (звездочка) - означает любое количество символов, предшествующих * и любые другие символы. Также это может быть и нулевое число символов. Пример: строка hello* соответствует строкам hello, helloo, helloo123;
. (точка) - любой один символ, но не менее одного. Кроме символа новой строки \n. Пример: строка hello. соответствует строкам hello1, hello2, helloR или hello_, но не hello;
+ (плюс) - тоже, что и точка, но повторять не менее одного раза;
? (знак вопроса) - тоже, что и плюс, но повторяется не более одного раза;
^ - начало строки;
$ - конец строки;
\b - граница слова;
\B - не граница слова;
| - или. Пример: (john|marry) - > совпадения или john или marry;
\ - экранирование. Все символы после \ (в т.ч. и метасимволы) считаются как обычные символы. Пример: \. -> обычная точка;
{x,y} (фигурные скобки) - указывают, сколько раз повторяется предыдущий символ. Где x - от скольких, y - до скольких раз. Если y пропущен {x,}, то считается до бесконечности. Пример: a{2,2} - > a будет повторяться 2 раза; hel(lo){1,7}- > lo должно повторяться от 1 и до 7 раз, иначе, совпадения не будет;
[...] (квадратные скобки с двух сторон) - определяют область значений символьных величин. К примеру, [0-9] соответствует всем числам от 0 до 9. Если сделать так [0-9]*, то соответствие может быть 1999 или 23454 или вообще пустоте.
Символы, которые встречаются в [...]:
^ - говорит, что встречается все, кроме...;
\w - один из символов буквы;
\W - не буква;
\d - цифра (тоже, что и запись 0-9);
\D - не цифра;
\s - пустой разделитель;
\S - не пустой разделитель;
\x - указывает на символ Unicode в шестнадцатеричном виде. За \x следует число (код);
\0 - указывает на символ Unicode в восьмеричном виде. За \0 следует число (код);
\а - символ звонка;
\f - символ конца страницы;
\n - символ конца строки;
\r - символ возврата каретки;
\t - символ горизонтальной табуляции;
\v - символ вертикальной табуляции;
Примеры:
[A-Za-z] - > A, c, G
[A-Z]* -> DKSAJHKJA
[^df] - > кроме символа d и f
4. Обратные ссылки.
Обратная ссылка указывает на значение, сохраненное ранее при обработке шаблона. Т.е. запоминается порядок совпадений для последующего использования. \1 соответствует первому совпадению, \2 - второму и т.д. Другими словами, когда ищется совпадение (первое оно или второе), то впоследствии можно использовать сохраненный результат для поиска. К примеру, нужно найти строки в которых будет /hello friends/, "go go go", 'go go go' (вместе с кавычками). Все строки имеют разное начало и разный конец. А именно, отличаются символы / " '. Шаблон для таких строк (["/']).*\1 . Здесь мы ищем первый символ, который совпадает (первый символ находится в круглых скобках из числа выбора в квадратных скобках) и в конце ставим \1 указывая, что нужно вставить уже проведенное совпадение. Число обратной ссылки зависит от числа скобок. Таким образом выражение ((привет|здравствуйте)(друг))\1 соответствует привет друг или здравствуйте друг. Если бы там стояло \2, то копировалось второе совпадение, а именно привет или здравствуйте. \3 копировала бы третье совпадение - друг. Чтобы считать какое совпадение относится ссылке, считайте открывающиеся скобки. И какому совпадению относятся скобки, то и будет копироваться. В нашем примере копируется в \1 все, т.к. первая скобка закрываться последней, \2 вторая скобка, \3 третья открывающаяся скобка.
5. Блокировка и разрешение в регулярных выражениях.
Этим выражением удобно находить совпадения, которые отвечают не только шаблону, а и условию. К примеру, нам нужно найти слово, но такое слово, после которого нет цифр. Пусть это слово будет НОВЫЙ. Шаблон будет таким \bНОВЫЙ(?![\D]*)\b . Под этот шаблон не должны попадать слова НОВЫЙ1, НОВЫЙ2. Условие (?![\D]*)\b говорит, следует искать слово НОВЫЙ, но за ним не должны стоять цифры. Т.е. шаблон (?!) - утверждающий поиск по отрицанию, а (?=) - просто утверждающий поиск. ПРИМЕЧАНИЕ: блокировка и разрешение в регулярных выражениях, возможно, работает только в приложениях KDE.
6. Программы.
Для удобства написания регулярных выражений существует программа KRegExpEditor. Программа позволяет создавать шаблоны кнопкой мыши, выбирая метасимволы. Также, осуществляется проверка в режиме реального времени. Все программы, которые написаны под KDE умеют вызывать эту программу и использовать ее результат.
Автор: Евгений Потребенко

