Изучение регулярных выражений

голоса
166

Я не очень понимаю, регулярные выражения. Можете ли вы объяснить мне их в удобном для наблюдения образом? Если есть какие-либо онлайн-инструменты или книги, не могли бы вы также ссылки на них?

Задан 07/08/2008 в 15:05
источник пользователем
На других языках...                            


1 ответов

голоса
679

Наиболее важной частью является концепции. После того, как вы поймете, как строительные блоки работают, различие в количестве синтаксиса немного более мягкие диалектов. Слой поверх синтаксиса регулярного выражения двигателя синтаксис языка программирования, который вы используете. Языки, такие как Perl удалить большую часть этого осложнения, но вы должны иметь в виду другие соображения, если вы используете регулярные выражения в программе C.

Если вы думаете о регулярных выражениях в качестве строительных блоков, которые вы можете смешивать и сочетать, как вам угодно, это поможет вам научиться писать и отлаживать свои собственные образцы, но и как понять закономерности, написанных другими.

Начните с простого

Концептуально, простейшие регулярные выражения являются буквальные символы. Шаблон Nсоответствует символу «N».

Регулярные выражения рядом друг с другом последовательностей матча. Например, шаблон Nickсовпадает с последовательностью «N» , за которой следует «I» с последующим «с» с последующим «к».

Если вы когда - либо использовали grepна Unix-даже если только для поиска обычных ищут струнные-у вас уже с помощью регулярных выражений! (The reв grepотносится к регулярным выражениям.)

Заказ из меню

Добавление только немного сложности, вы можете соответствовать либо «Ника» или «ник» с рисунком [Nn]ick. Часть в квадратных скобках представляет собой символьный класс , который означает , что он точно соответствует один из вложенных символов. Вы можете также использовать диапазоны в классах символов, так что [a-c]соответствует либо «а» или «B» или «с».

Шаблон .является особенным: а не подогнанным только буквальной точкой, она соответствует любому символу . Это же концептуально , как действительно большой класс символов [-.?+%$A-Za-z0-9...].

Подумайте о классах символов в меню: выбрать только один.

Полезные сочетания клавиш

Использование .может сэкономить много печатать, и есть другие ярлыки для общих шаблонов. Допустим , вы хотите , чтобы соответствовать неотрицательные целые числа: один способ написать это [0-9]+. Цифры являются частой мишенью матча, так что вы можете использовать вместо этого , \d+чтобы соответствовать неотрицательным целым числам. Другие \s(пробел) и \w(символы слова: буквенно - цифровые или подчеркивание).

В верхнем регистре варианты их комплементы, поэтому \Sсоответствует любому нон -whitespace характер, например.

После того, как не хватает

Оттуда, вы можете повторить части вашего шаблона с кванторами . Например, шаблон ab?cсоответствует «ABC» или «AC» , потому что ?квантификатор делает подшаблон он модифицирует по желанию. Другие кванторы

  • * (Ноль или более раз)
  • + (Один или несколько раз)
  • {n}(ровно п раз)
  • {n,}(по крайней мере п раз)
  • {n,m}(по крайней мере п раз , но не более чем т раз)

Ввод некоторых из этих блоков вместе, модель [Nn]*ickсоответствует всем

  • Ик
  • Ник
  • Ник
  • Nnick
  • nNick
  • nnick
  • (и так далее)

Первый матч демонстрирует важный урок: *всегда удается! Любой шаблон может соответствовать ноль раз.

группирование

Квантор изменяет шаблон для его непосредственно слева. Можно было бы ожидать , 0abc+0чтобы соответствовать «0abc0», «0abcabc0», и так далее, но картина сразу слева от плюс квантор c. Это означает , что 0abc+0матчи '0abc0', '0abcc0', '0abccc0', и так далее.

Для того, чтобы соответствовать один или несколько последовательностей «ABC» с нулями на концах, используйте 0(abc)+0. Скобки обозначают подшаблон , которые могут быть определены количественно как единое целое. Это также характерно для регулярных выражений двигателей , чтобы сохранить или «захватить» часть входного текста , который соответствует группе в круглых скобках. Извлечение битов таким образом , является гораздо более гибким и менее подвержены ошибкам , чем подсчет индексов и substr.

перемежаемость

Ранее мы видели один путь , чтобы соответствовать либо «Ника» или «ник». Другой с чередованием , как в Nick|nick. Помните , что чередование включает в себя все , чтобы его левый и все справа от него . Использование группирования скобки для ограничения объема |, например , (Nick|nick).

В качестве другого примера, вы могли бы написать что то же самое , [a-c]как a|b|c, но это, вероятно, будет оптимальным , поскольку многие реализации предположить альтернативы будет иметь длину больше , чем 1.

Спасаясь

Хотя некоторые символы померяться, другие имеют особое значение. Шаблон \d+не соответствует обратной косой черты , за которой следует строчной D с последующим знаком плюс: чтобы получить , что мы будем использовать \\d\+. Обратный слэш удаляет особое значение из следующего символа.

Жадность

Регулярные выражения кванторы жадные. Это означает, что они совпадают много текста, так как они, возможно, могут в то время, позволяя весь рисунок, чтобы соответствовать успешно.

Например, скажем, вход

«Привет,» сказала она, «Как ты?»

Можно было бы ожидать , ".+"чтобы соответствовать только «Привет» , а затем будете удивлены , когда вы видите , что оно соответствует с «Hello» весь путь через «ты?».

Для того, чтобы перейти от жадного к тому , что вы могли бы думать , как осторожные, добавить дополнительный ?к квантору. Теперь вы понимаете , как \((.+?)\), пример из вашего вопроса работы. Это соответствует последовательности буквальном левой скобки, за которым следует один или более символов, и заканчивающуюся правой скобкой.

Если вход «(123) (456)», то первый захват будет «123». Нежадные кванторы хотят, чтобы остальная часть шаблона, чтобы начать соответствие как можно скорее.

( Что касается вашего путаницы, я не знаю ни одного регулярного выражения диалекта , где ((.+?))будет делать то же самое. Я подозреваю , что что - то заблудился в передаче где - то по пути.)

Якоря

Используйте специальный шаблон , ^чтобы соответствовать только в начале вашего входа и $соответствовать только в конце. Создание «форзацев» с узорами , где вы говорите, «Я знаю , что на переднем и заднем, но дайте мне все между» является полезным методом.

Допустим, вы хотите, чтобы соответствовать комментарии вида

-- This is a comment --

вы бы написать ^--\s+(.+)\s+--$.

Построй свой собственный

Регулярные выражения являются рекурсивными, так что теперь вы понимаете эти основные правила, вы можете комбинировать их, как вам нравится.

Инструменты для написания и отладки регулярных выражений:

книги

свободные ресурсы

сноска

†: Заявление выше , что .соответствует любому символу , является упрощение для педагогических целей, не совсем верно. Dot соответствует любому символу , кроме новой строки "\n", но на практике редко можно ожидать образец такого , как .+пересечь границу новой строки. Perl регулярных выражений есть /sпереключатель и Java Pattern.DOTALL, например, чтобы .соответствовать любому символу вообще. Для языков , которые не имеют такой функции, вы можете использовать что - то вроде[\s\S] , чтобы соответствовать «любой пробел или любой непробельным», другими словами , что угодно.

Ответил 03/05/2010 в 17:09
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more