регулярные выражения для самых начинающих

Идея этого поста не научить вас писать regexp, а дать вам возможность узнать что такое есть. И когда этим удобно пользоваться… Обращайтесь если что-то непонятно. Или вообще ничего не понятно, но вам интересен этот инструмент…

Когда-то очень давно была придумана такая замечательная вещь, как regexp. Regular Expressions – возможность работать со строками с использованием шаблонов.

Когда это может быть полезно обычному человеку? Представьте, что у вас есть вот такое:

Петя Васильевич Васин 2010-01-01
Ян Петрович Петин 2010-02-31
Александр Иванович Машин 2009-11-21

И вам надо поменять это на

2010-01-01 Петя Васин
2010-02-31 Ян Петин
2009-11-21 Александр Машин

Как решить такую задачу? Скопировать столбик не получится ибо имена и фамилии разной длины… Можно извращаться с экспортом в excel и играть со столбцами. Можно руками менять каждую строку, но если их тысячи?

А очень просто:

Практическая часть

Итак, надо взять любой редактор, который понимает regexp (например notepad++). Можно делать это и в простом excel, но надо чуть дополнительных теложвижений. Если инетресно – расскажу. (UPD: регулярные выражения в Excel)

Как этим пользоваться? Качаем и устанавливаем Notepad++
Устанавливаем
Открываем в нём файл с тексом

Вызываем диалог поиска с заменой (или нажимаем Ctrl+H)

Вводим regexp, на что поменять и указываем, что это именно regular expression

Получаем результат…

В хелпе этого редактора немного есть…

Теперь объяснение что там такое было написано

Берём вот такой regexp
(\w+) (\w+) (\w+) (\d+-\d+-\d+)
и делаем замену на
\4 \1 \3

Попытаемся избавиться от магической непонятности написанного… Regexp позволяет описывать то, что нам надо специальными конструкциями:

\d – цифра
\w – буква
\W – НЕ буква (т.е. цифры, знаки, …)
^ – начало строки
$ – конец строки
. – один любой символ
[1-9] – одна цифра от единицы до 9
(a|b|c) – одна буква или a или b или с

+ – означает один или больше
* – означает 0 или больше

и т.д. Вы можете посмотреть на список, например, тут или просто погуглив на слово regexp.

Например дата:
\d{2,4}-\d{2}-\d{2} – от двух до 4 цифр, знак ‘-‘, две цифры, знак ‘-‘, две цифры
или так:
\d\d\d\d-\d\d-\d\d
или так
[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]

^\d{2,}\s*$ – найдёт все строки, где число начинается в самом начале строки, содержит минимум 2 цифры, и в конце может содержать любое количество пробелов до самого конца строки.

Рассмотрим что там было в примере:

(\w+) (\w+) (\w+) (\d+-\d+-\d+)
Что в этих строках?
Скобки в данном случае означают группу. Их номера идут с единицы.

Т.е. первая группа будет состоять из любого количества БУКВ до первого пробела (имя)
вторая группа будет состоять из любого количества БУКВ до следующего пробела (отчество)
третья группа будет состоять из любого количества БУКВ до следующего пробела (фамилия)
четвёртая группа – это одна или больше цифра, знак минус, одна или больше цифра, знак минус, одна или больше цифра…

Заменить на \4 \1 \3 – т.е. 4-ую группу, потом первую и третью (дата, имя, фамилия)

Можно переписать лучше
(\w+) (\w+) (\w+) (\d{4}-\d{2}-\d{2})
Всё то же самое, но точно указано, что цифр будет четыре, минус, две цифры, минус, две цифры

Просто? :) regexp намного легче писать, чем читать :) Попробуйте. Внизу ссылки, где можно поиграться…

Не все стандарты поддерживают запись \d{1,2} – (одна или две цифры)
тогда приходится писать \d+\d* – первая цифра обязательно, второй может не быть (есть тонкости, но пока грузить не буду)
или [0-9]+[0-9]*

Несколько ссылок:
Знакомство с регулярными выражениями
Regexp Tester
Для написания regexp очень рекомендую online это (eng)

Примеры:

  • найти все адреса почты в тексте:
    [A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}
    одна или больше буква от A до Z, цифры, дополнительные значки, потом знак собаки, потом опять одна или больше буква от A до Z, цифры, дополнительные значки, потом точка, и от 2 до 4 символов от A до Z
  • заменить все повторяющиеся пробелы на один пробел
    (\s)+
    меняем на ” “ или на \1
  • Есть данные, а надо сделать insert в базу:
    (\w+) (\w+)
    меняем на
    insert … values (‘\1’, ‘\2’);
  • и так далее…

    Если вы освоите этот язык поиска и манипуляций текстом, то сможете решить массу возникающих проблем :)

    Обращайтесь, если что-то непонятно…