[FAQ] памятка по регулярным выражениям (regexp)

FAQ. Ответы на часто задаваемые вопросы.

Модератор: 4epT

Правила форума
Этот раздел является руководством и тут разрешено оставлять сообщения лишь для уточнения и внесения корректив в существующие материалы. Для вопросов существует ряд других разделов.
DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

[FAQ] памятка по регулярным выражениям (regexp)

Сообщение DInvalid »

Примеры
Что ищем : Ключевое выражение
слово "ракета": ракета
слово "ракета" или "космос" ракета|космос
слово "дом" и затем "строитель" дом.*строитель
слово "дом" и "строитель" в любой последовательности (дом.*строитель)|(строитель.*дом)
слово "выборы" с учетом окончания выбор(ы|ах|ам)
упоминания о политических партиях, слово партия находится не дальше 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
Аватара пользователя
Jerry
Профессионал
Сообщения: 1047
Зарегистрирован: Сб ноя 04, 2006 12:26 pm
Контактная информация:

Сообщение Jerry »

есть такая программка, вообще ит толпа таких программок, например regexBuddy. Т.е. не скажу, что она лучше всех, но я скачал, меня устраивает в принципе. Так вот, она позволяет строить выражения тыкая прямо в кнопочки условий, проверять выражения на примерах, обрабатывать файлы и много другой фигни. Оч удобно.
DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

Сообщение DInvalid »

Да, у меня был regexBuddy, но он толи денег захотел, то ли что то еще, но я его снес...
Удобная программа, но понимать как регэкспы работают в уме для тех то хоть что то делает с перлом - насущная необходимось...
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Он-лайновый "конструктор шаблонов". Скриншот ниже.

Как этим пользоваться? Хинт от 4орта - загоняем фразу, которую нам нужно "разгрести" (например, строку, скопированную из консоли ОпенКоры) и в верхнее поле (регулярное выражение), и в нижнее (исходная фраза); начинаем изменять верхнее поле, добавляя метасимволы/модификаторы, и смотрим, что же у нас получается в поле "результат".

Добавлено спустя 11 минут 49 секунд:

"Полный текст" того, как по мнению г-на 4орта надо писать авто-макросы, основанные на регекспе. Публикуеццо без купюр. :twisted:
Задача стоит - поймать в консоли "эмоцию" моего собственного чара (очевидно, для xKore 1), но у новичка это не получается, потому что он пишет:

automacro blablabla {
console /мойник (0): *SP*/
call {...

...ну, ясный-красный это не срабатывает, ведь * (звездочка) - это ж метасимвол.
4орт: учись чувак:

Делай раз:
Хочу написать макрос, нада почитать что же это такое. Читаем

Делай два:
Мне подойдет условие "console", но там используется какой-то <набор_символов> (regexp). Дается какая-то ссылка, но она какая-то непонятная... Надо бы поискать по гайду, может что ещё есть про regexp:
$.lastMatchN - набор символов с шаблона regexp. Пример №1 Пример №2
Делай три:
Лезем в Пример №1...бла, бла, бла...потом мистер Sauron сознаётся и выдаёт доку (я учился по ней):
отсюда мы и узнаём что есть некие метасимволы, и что * на самом деле:
* - повторяется 0 или большее число раз;
ЗЫ: там же есть ссылочка на конструктор шаблона

1. в Исходный текст пишем: мойник (0): *SP*
2. в Регулярное выражение пишем: мойник (0): *SP*
3. в Результаты обработки: нефига мы не получаем..

значит что-то не так с шаблоном..

4. закрываем в шаблоне все метасимволы: мойник \(0\): \*SP\*
5. ура, в Результаты обработки получаем: (мойник (0): *SP*)
Вложения
http://www.pcre.ru/eval/
http://www.pcre.ru/eval/
pcrerueval.png (5.14 КБ) 5954 просмотра
Последний раз редактировалось piroJOKE Пн янв 07, 2008 4:44 pm, всего редактировалось 1 раз.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Нам пишут некоторые пионэры: "Да это же Перл! Мы не хотим изучать эту сложную штуку, нам она нафиг не нужна и в жизни нигде не пригодицца!".

Позвольте-ка вам кое-что пояснить. Регулярные выражения используются в чертовой куче программ, не имеющих никакого отношения к Перлу!
Я специально поковырял свой компьютер, чтобы нащупать программы, в которых они используются. И что же?! Я нашел их несколько штук! Давайте взглянем на них, чисто ради примера:
Вложения
TotalCommander позволяет использовать регэкспы при поиске.
TotalCommander позволяет использовать регэкспы при поиске.
tcregex.png (4.01 КБ) 5974 просмотра
Популярная роутилка и раздавалка и-нета Kerio WinRoute Firewall использует регэкспы для разгребания логов, настройки фильтрации и т.д.
Популярная роутилка и раздавалка и-нета Kerio WinRoute Firewall использует регэкспы для разгребания логов, настройки фильтрации и т.д.
kerioregexp.png (6.67 КБ) 5932 просмотра
Другой популярный плагин к FireFox'у, NoScript.
Другой популярный плагин к FireFox'у, NoScript.
ffnsregexp.png (7.06 КБ) 5922 просмотра
Популярнейший плагин AdBlockPlus к броузеру FireFox эффективно гасит рекламу. И что вы думаете? В качестве шаблонов он использует регэксп!
Популярнейший плагин AdBlockPlus к броузеру FireFox эффективно гасит рекламу. И что вы думаете? В качестве шаблонов он использует регэксп!
ffabpregexp.png (6.55 КБ) 5921 просмотр
В Винде мы можем пользоваться портированными из юникса GNU-шными утилитами. Многие из них поддерживают регэксп. Еще бы, ведь это &amp;quot;родной&amp;quot; язык описания шаблонов для юнихов.
В Винде мы можем пользоваться портированными из юникса GNU-шными утилитами. Многие из них поддерживают регэксп. Еще бы, ведь это &quot;родной&quot; язык описания шаблонов для юнихов.
unxutilsregexp.png (1.07 КБ) 5941 просмотр
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
4epT
macro-маньячина
Сообщения: 2792
Зарегистрирован: Чт дек 21, 2006 1:23 pm
Сервер RO:: 4game
Discord: ya4ept#8494
Контактная информация:

Сообщение 4epT »

вот ещё один конструктор, ток я его ещё не юзал:

http://regexpr.ru

Добавлено спустя 9 минут 41 секунду:

ахаха, там ещё и "очень крутой" форум есть :) видимо по програмированию
Быстро и качественно напишу конфиг (макрос)! Стучи!
¤ Свежий бот ¤ Config checker ¤ Manual ¤
Изображение
Изображение
Ответить