Идея этого поста не научить вас писать regexp, а дать вам возможность узнать что такое есть. И когда этим удобно пользоваться… Обращайтесь если что-то непонятно. Или вообще ничего не понятно, но вам интересен этот инструмент…
Когда-то очень давно была придумана такая замечательная вещь, как regexp.
Когда это может быть полезно обычному человеку? Представьте, что у вас есть вот такое:
И вам надо поменять это на
Как решить такую задачу? Скопировать столбик не получится ибо имена и фамилии разной длины… Можно извращаться с экспортом в excel и играть со столбцами. Можно руками менять каждую строку, но если их тысячи?
А очень просто:
Практическая часть
Итак, надо взять любой редактор, который понимает regexp (например
Как этим пользоваться? Качаем и устанавливаем
Устанавливаем
Открываем в нём файл с тексом
Вызываем диалог поиска с заменой (или нажимаем 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 или больше
и т.д. Вы можете посмотреть на список, например,
Например дата:
\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]*
Несколько ссылок:
Для
Примеры:
[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}
одна или больше буква от A до Z, цифры, дополнительные значки, потом знак собаки, потом опять одна или больше буква от A до Z, цифры, дополнительные значки, потом точка, и от 2 до 4 символов от A до Z
(\s)+
меняем на ” “ или на \1
(\w+) (\w+)
меняем на
“insert … values (‘\1’, ‘\2’);“
и так далее…
Если вы освоите этот язык поиска и манипуляций текстом, то сможете решить массу возникающих проблем :)
Обращайтесь, если что-то непонятно…