[FAQ] памятка по регулярным выражениям (regexp)
Добавлено: Сб фев 10, 2007 5:22 pm
Примеры
Что ищем : Ключевое выражение
слово "ракета": ракета
слово "ракета" или "космос" ракета|космос
слово "дом" и затем "строитель" дом.*строитель
слово "дом" и "строитель" в любой последовательности (дом.*строитель)|(строитель.*дом)
слово "выборы" с учетом окончания выбор(ы|ах|ам)
упоминания о политических партиях, слово партия находится не дальше 10 символов от слова политическая политическ(ая|ой|ую).{0,10}парти(я|и|ю|ей)
губернаторские выборы (губернаторск(ие|их|им).{0,10}выбор(ы|ах|ам))|(выбор(ы|ах|ам).{0,10}губернатор(|а|у))
выборы, но не губернаторские выбор(ы|ах|ам).{0,10}(?!.*губернатор(|а|у))
Логика разбора ключевых выражений
Любой символ обозначает себя самого если это не метасимвол. Если вам нужно отменить действие метасимвола то поставьте перед ним '\'.
Строка символов обозначает строку этих символов.
Множество возможных символов (класс) заключается в квадратные скобки '[]' это значит что в данном месте может стоять один из указанных в скобках символ. Если первый символ в скобках это '^' - значит не один из указанных символов не может стоять в данном месте выражения. Внутри класса можно употреблять символ '-' обозначающий диаппазон символов. Например a-z один из малых букв латинского алфавита, 0-9 - цифра и т.д.
Все символы, включая специальные можно обозначать с помощью '\' как в языке С.
Альтернативные последовательности разделяются символом '|' Заметьте, что внутри квадратных скобок это обычный символ.
Внутри регулярного выражения можно указыват "подшаблоны", заключая их в крунлые скобки и ссылаться на них как '\номер' Первая скобка обозначается как '\1'.
Логическая группировка
| - альтернатива (или)
() - группировка
Группировка: круглые скобки
Круглые скобки применяются для определения группы символов или части выражения, к которой относится символ альтернативы ("|") или модификатор.
Примеры
дом(ами|ом)=>"домами" или "домом"
домами|ом=>"домами" или "ом".
домами?=>"домами" или "домам".
дом(ами)?=>"дом" или "домами".
[] - класс символов
Примеры
[abc]=>"a", "b" или "c"
[^abc]=>любая строчная буква кроме "a", "b" или "c".
С применением модификаторов:
[a-z]?=>любая строчная буква, или отсутствие символа
.*=>любое число любых символов
Использование метасимволов:
\w - алфавитно-цифровой или '_' символ
\W - не алфавитно-цифровой или '_' символ
\s - один пробел
\S - один не пробел
\d - одна цифра
\D - одна не цифра
Обратите внимание что все это "один" символ. Для обозначения последовательности применяйте модификаторы. Так:
. - любой символ
\w+ - слово
\d+ - целое число
[+-]?\d+ - целое со знаком
[+-]?\d+\.?\d* - число с точкой
Модификаторы метасимволов
(пишутся после метасимвола):
* - повторяется 0 или большее число раз
+ - повторяется 1 или большее число раз
? - 1 или 0 раз
{n} - точно n раз
{n,} - по меньшей мере раз
{n,m} - не менше n, но и не больше m
Примеры
дома?=>"дом" или "дома"
дома+=>"дома", "домаа" и т.д.
дома*=>"дом", "дома", "домаа" и т.д
Во все других случаях фигурные скобки считаются обычными (регулярными) символами. Таким образом '*' эквивалентна {0,} , '+' - {1,} и '?' - {0,1}. n и m не могут быть больше 65536.
По умолчанию действие метасимволов "жадно" (greedy). Совпадение распространяется столько раз сколько возможно не учитывая результат действия следуюющих метасимволов. Если вы хотите "уменьшить их аппетит" то используйте символ '?'. Это не изменяет значение метасимволов просто уменьшает распространение. Таким образом:
*? - станет 0 и более
+? - 1 и более
?? - 0 или 1 раз
{n}? - точно n раз
{n,}? - не меньше n раз
{n,m}? - больше или равно n и меньше m раз
Расширенные возможности поиска
(?:шаблон) - группировка как и '( )' но без обратной ссылки
(?=шаблон) - "заглядывание" вперед.
Например \w+(?=\t) соответствует слову, за которым идет табуляция, но символ '\t' не включается в результат.
(?!шаблон) - "заглядывание" вперед по отрицанию.
Шаблон должен охватывать полностью предполагаемую область поиска. Рекомендуется использовать .* и прочие мультипликаторы.
Источник
http://www.scanet.info/regexp_ru.htm
Что ищем : Ключевое выражение
слово "ракета": ракета
слово "ракета" или "космос" ракета|космос
слово "дом" и затем "строитель" дом.*строитель
слово "дом" и "строитель" в любой последовательности (дом.*строитель)|(строитель.*дом)
слово "выборы" с учетом окончания выбор(ы|ах|ам)
упоминания о политических партиях, слово партия находится не дальше 10 символов от слова политическая политическ(ая|ой|ую).{0,10}парти(я|и|ю|ей)
губернаторские выборы (губернаторск(ие|их|им).{0,10}выбор(ы|ах|ам))|(выбор(ы|ах|ам).{0,10}губернатор(|а|у))
выборы, но не губернаторские выбор(ы|ах|ам).{0,10}(?!.*губернатор(|а|у))
Логика разбора ключевых выражений
Любой символ обозначает себя самого если это не метасимвол. Если вам нужно отменить действие метасимвола то поставьте перед ним '\'.
Строка символов обозначает строку этих символов.
Множество возможных символов (класс) заключается в квадратные скобки '[]' это значит что в данном месте может стоять один из указанных в скобках символ. Если первый символ в скобках это '^' - значит не один из указанных символов не может стоять в данном месте выражения. Внутри класса можно употреблять символ '-' обозначающий диаппазон символов. Например a-z один из малых букв латинского алфавита, 0-9 - цифра и т.д.
Все символы, включая специальные можно обозначать с помощью '\' как в языке С.
Альтернативные последовательности разделяются символом '|' Заметьте, что внутри квадратных скобок это обычный символ.
Внутри регулярного выражения можно указыват "подшаблоны", заключая их в крунлые скобки и ссылаться на них как '\номер' Первая скобка обозначается как '\1'.
Логическая группировка
| - альтернатива (или)
() - группировка
Группировка: круглые скобки
Круглые скобки применяются для определения группы символов или части выражения, к которой относится символ альтернативы ("|") или модификатор.
Примеры
дом(ами|ом)=>"домами" или "домом"
домами|ом=>"домами" или "ом".
домами?=>"домами" или "домам".
дом(ами)?=>"дом" или "домами".
[] - класс символов
Примеры
[abc]=>"a", "b" или "c"
[^abc]=>любая строчная буква кроме "a", "b" или "c".
С применением модификаторов:
[a-z]?=>любая строчная буква, или отсутствие символа
.*=>любое число любых символов
Использование метасимволов:
\w - алфавитно-цифровой или '_' символ
\W - не алфавитно-цифровой или '_' символ
\s - один пробел
\S - один не пробел
\d - одна цифра
\D - одна не цифра
Обратите внимание что все это "один" символ. Для обозначения последовательности применяйте модификаторы. Так:
. - любой символ
\w+ - слово
\d+ - целое число
[+-]?\d+ - целое со знаком
[+-]?\d+\.?\d* - число с точкой
Модификаторы метасимволов
(пишутся после метасимвола):
* - повторяется 0 или большее число раз
+ - повторяется 1 или большее число раз
? - 1 или 0 раз
{n} - точно n раз
{n,} - по меньшей мере раз
{n,m} - не менше n, но и не больше m
Примеры
дома?=>"дом" или "дома"
дома+=>"дома", "домаа" и т.д.
дома*=>"дом", "дома", "домаа" и т.д
Во все других случаях фигурные скобки считаются обычными (регулярными) символами. Таким образом '*' эквивалентна {0,} , '+' - {1,} и '?' - {0,1}. n и m не могут быть больше 65536.
По умолчанию действие метасимволов "жадно" (greedy). Совпадение распространяется столько раз сколько возможно не учитывая результат действия следуюющих метасимволов. Если вы хотите "уменьшить их аппетит" то используйте символ '?'. Это не изменяет значение метасимволов просто уменьшает распространение. Таким образом:
*? - станет 0 и более
+? - 1 и более
?? - 0 или 1 раз
{n}? - точно n раз
{n,}? - не меньше n раз
{n,m}? - больше или равно n и меньше m раз
Расширенные возможности поиска
(?:шаблон) - группировка как и '( )' но без обратной ссылки
(?=шаблон) - "заглядывание" вперед.
Например \w+(?=\t) соответствует слову, за которым идет табуляция, но символ '\t' не включается в результат.
(?!шаблон) - "заглядывание" вперед по отрицанию.
Шаблон должен охватывать полностью предполагаемую область поиска. Рекомендуется использовать .* и прочие мультипликаторы.
Источник
http://www.scanet.info/regexp_ru.htm