Страница 1 из 1

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

Добавлено: Сб фев 10, 2007 5:22 pm
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

Добавлено: Пн фев 12, 2007 8:35 am
Jerry
есть такая программка, вообще ит толпа таких программок, например regexBuddy. Т.е. не скажу, что она лучше всех, но я скачал, меня устраивает в принципе. Так вот, она позволяет строить выражения тыкая прямо в кнопочки условий, проверять выражения на примерах, обрабатывать файлы и много другой фигни. Оч удобно.

Добавлено: Пн фев 12, 2007 3:44 pm
DInvalid
Да, у меня был regexBuddy, но он толи денег захотел, то ли что то еще, но я его снес...
Удобная программа, но понимать как регэкспы работают в уме для тех то хоть что то делает с перлом - насущная необходимось...

Добавлено: Вс янв 06, 2008 1:04 pm
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*)

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

Позвольте-ка вам кое-что пояснить. Регулярные выражения используются в чертовой куче программ, не имеющих никакого отношения к Перлу!
Я специально поковырял свой компьютер, чтобы нащупать программы, в которых они используются. И что же?! Я нашел их несколько штук! Давайте взглянем на них, чисто ради примера:

Добавлено: Вт янв 15, 2008 7:24 pm
4epT
вот ещё один конструктор, ток я его ещё не юзал:

http://regexpr.ru

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

ахаха, там ещё и "очень крутой" форум есть :) видимо по програмированию