15 регулярок для Sublime на все случаи жизни.
Пятилетний ребенок разберется, как через поисковое окошко найти в тексте комбинацию цифр «1999» или «1800». А вот как найти все комбинации из четырех цифр идущих подряд? Или все номера телефонов? Или фрагменты текста внутри html-тегов?
Для решения подобных задач (и не только их) несколько десятилетий назад были придуманы регулярные выражения (Regular Expression). Это универсальная система описания текстовых строк, которая применяется в разных приложениях и языках программирования.
На синтаксисе регулярных выражений останавливаться не будем, а сразу перейдем к практике. А когда вы войдете во вкус, расскажем как расширить свой кругозор в этой теме.
В во всех примерах мы будем использовать Sublime Text. Скачать его установочный файл можно на официальном сайте приложения. При желании можно использовать другой текстовый редактор (список программ с поддержкой регулярных выражений есть в конце статьи).
1. Годы
[code]
\b\d{4}\b
[/code]
Итак, у нас есть окно редактора, в котором есть исходный текст и регулярное выражение. Нам нужно сделать следующее:
- 1. Нажать Command+F;
- 2. Сделать активной кнопку .* в левом нижнем углу;
- 3. Вставить регулярное выражение в поисковое окошко и нажать на кнопку Find All;
- 4. Нажать Command+C;
- 5. Нажать Command+N или выбрать нужный документ;
- 6. Нажать Command+V и радоваться результату.
В остальных 14 примерах надо делать тоже самое.
2. Годы с 1900 по 2099
[code]
\b(19|20)\d{2}\b
[/code]
3. Ссылки
[code]
(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?
[/code]
4. Адреса электронной почты
[code]
\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b
[/code]
5. Номера телефонов
[code]
((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}
[/code]
6. Почтовые индексы
[code]
\b\d{6}\b
[/code]
7. IP-адреса (IPv4)
[code]
(?:[0-9]{1,3}\.){3}[0-9]{1,3}
[/code]
8. Содержимое html-тегов
[code]
<h3>(.*?)</h3>
[/code]
9. Значения атрибутов html-тегов
[code]
title=["’]?((?:.(?!["’]?\s+(?:\S+)=|[>"’]))+.)["’]?
[/code]
10. Имя+Фамилия
[code]
[А-ЯЁ][а-яё]+ [А-ЯЁ][а-яё]+
[/code]
11. Римские цифры
[code]
[MDCLXVI]+
[/code]
12. Широта/Долгота
[code]
-?[0-9]{1,3}(?:\.[0-9]{1,10})?
[/code]
13. Время
[code]
([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]
[/code]
14. Даты
В форматах дд/мм/гггг,дд-мм-гггг или дд.мм.гггг.
[code]
(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})
[/code]
15. Числа с десятичными дробями
С разделителем запятой:
[code]
[-+]?[0-9]*\,?[0-9]+
[/code]
С разделителем точкой:
[code]
[-+]?[0-9]*\.?[0-9]+
[/code]
Альтернативы
Естественно, на Sublime Text свет клином не сошелся и есть и другие текстовые редакторы с поддержкой регулярных выражений. Скорее всего, как минимум, с несколькими из них вы в определенной степени знакомы:
- Atom;
- BBEdit;
- Brief;
- Elvis;
- Emacs;
- BBEdit;
- Brief;
- Coda;
- Elvis;
- Emacs;
- Microsoft Word;
- NEdit;
- Notepad++;
- NoteTab;
- Nvi;
- PSPad;
- SubEthaEdit;
- TextMate;
- TSE;
- UltraEdit;
- Vile;
- Vim.
Полезные веб-сервисы
На regexr.com можно протестировать регулярные выражения и узнать что обозначают их отдельные синтаксические элементы. Также на этом сайте теоретическая информация по теме.
По моему опыту, люди, которые не знакомы с регулярными выражениями, чаще всего сталкиваются с проблемой, описанной в четвертом пункте этой статьи. Для ее решения можно не заморачиваться, а использовать онлайн-сервис для извлечения email-адресов из текста
Для тех, кто хочет узнать больше
В статье Мой ТОП-9 книг для программистов я упоминала книгу «Регулярные выражения. Сборник рецептов». В ней можно найти много готовых практических примеров, но она не сделает вас «богом регулярок». Для этого понадобится литература посерьезнее.
Авторитетные люди по всему миру рекомендует для глубокого и тонкого понимания этой темы прочитать ставшую классикой книгу Джеффри Фридла «Регулярные выражения».
Но для начала можно пройти онлайн-курс на regexone:
84 комментариев
Форум →Ш-Шта?!
@TVP, шта-шта, иди регулярки учи)
@TVP, что конкретно Вас смущает?
@Ирина Чернова, во первых непонятно как это все относится к теме ресурса, а во вторых как уже ранее заметил “metal_king”, в повседневной жизни этот способ не особо применим…
@TVP, 1. Чем лайфхаки по работе с текстом на Mac не соответствуют тематике ресурса? 2. А тема использования регулярок в разработке в статье не обсуждается)
@Ирина Чернова, я вообще изначально оставил подобный комментарий, что бы сказать, что стоит подобные темы как то проще “разжовывать” что-ли… Я даже сам не сразу понял о чем речь…
@TVP, так я как раз и постаралась максимально проще. Нужно собрать данные из файлов – выбрал подходящую регулярку, скопировал и используешь)
@Ирина Чернова, ну деградирую, что поделать)
@TVP, так я же вас не упрекаю))) если вам не показалась подача простой, то мне следует задуматься над этим… А как бы Вы видели идеальную подачу такой статьи?
@Ирина Чернова, кстати, Наталья, а разьясните подалуйста… Что это за рейтинги такие-” свмые активные” и -“самые любимые” как я там оказался, и что за циферки напротив? Модет я через чур ахтивным стал и за мной уже едут?))
@TVP, цифра это число комментариев за неделю (пн-воскресенье). А “Наталья” это какое-то турецкое оскорбление?
@Ирина Чернова, это Хинди) простите, не знаю почему вас Натальей назвал)
@TVP, Серега, че с тобой?))))))))
@Ирина Чернова, а хотелось бы увидеть еще рейтинг самых забаненых, так сказать самые сливки, а не только лишь отсталых)
@TVP, поддерживаю;)
@Ирина Чернова, зашёл почитать про айфоны
@lonz, ну так статья для пользователей OS X и iOS. Поставьте на свой iPhone TextWrape и используйте для поиска текста регулярки в нем)
@Ирина Чернова, не представляю, если бы я зашёл, например, на Engadget, даже и не в раздел мобайл, и почитал бы там про “регулярки”. Но понятно почему так делаете, конечно. Жаль.
@lonz, статья не про регулярки, а про решение проблемы извлечения данных из текста.
Регулярные удобно чтонибудь быстро сделать из текста. Но в жизни пригодится только для простых приложений. Не критичных по скорости.
@metal_king, тема ~реальной жизни~ в статье не затрагивается))) И не надо заводить разговор ~про это~:-) А то сейчас начнется аля ~хабросрач~, как это часто бывает)
Но за высказанное мнение большое спасибо)
Спасибо! очень полезно. а не подскажете, TextWrangler поддерживает? я только им пользуюсь.
@Fillosoff, да, вроде)
@Fillosoff, я тоже им. Не поддерживает ;(
@Артур Малосиев, @Fillosoff, при поиске ставьте галочку на параметр Grep и начнет поддерживать)
@Ирина Чернова, решил проверить на номерах телефонов. поставил галочку на Grep, задал поиск по шаблону – который выше. так мне по очереди всё, что было с цифрами находить стал. все суммы – стоимости услуг перебрал в файле. и только в самом конце, наконец-то добрался до телефонов.) может, что не так делаю. но похоже, @Артур Малосиев прав – не поддерживает. жаль..
@Fillosoff, а приведите пожалуйста пару примеров как у Вас записаны номера телефонов)
@Ирина Чернова, я просто взял прайс. там телефонов всего два было – оба в конце, в обычном формате: +7 (***) ***-**-**.
@Fillosoff, у меня в TextWrangel получилось с такой регуляркой
7(.*)(\d{3})-(\d{2})-(\d{2})
У regexp для TextWrangle есть синтаксические особенности (гуглятся по запросу textwrangle grep syntax).
@Ирина Чернова, спасибо! попробую!)
Спасибо, даже не догадывался, что можно использовать регулярно таким образом.
Но странно, что в подборке нет легендарной программы Coda – там эта функция тоже имеется
>Ссылки
>(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?
Зачем такие извороты по вытаскиванию ссылок из тега href???
@Miku Hatsune, эта регулярка не предусматривает наличие аттрибута href.
@Ирина Чернова, на скриншоте все ссылки в href
Даже если нет почему бы не сделать http|ftp|https :// и до пробела? Что вообще ищет выражение из статьи?
@Miku Hatsune, ну я просто поленилась искать другой текст со ссылками(
До пробела текст искать нельзя (в смысле можно конечно же, но не всегда), так как:
поиск может происходить внутри csv-файлов где разделителями могут быть ; | табуляция и т.д. и пробелов не быть вообще (только переносы строк).
Поиск ссылок можно происходить в JSON-файлах где ссылка тоже не будет заканчиваться пробелом, а будет заканчиваться кавычкой и т.д.
Регулярка из статьи ищет непрерывную последовательность символов, допустимых в гипперссылках, идущую после http или https или ftp.
Спасибо, без объяснения это выглядит как айфон для жителей XVI века. Понятно, что это какое-то лютое колдовство, и лучше сразу ведьму сжечь.
@twelve, жжешь ;)))
“0-9” бы везде на \d заменить для упрощения.
@Maxim Velgach, спасибо! Но: работает и ладно)
Вот бы мне обычному строителю понять хотя бы 5% того что тут написано
@Seva2006, не парься они и 1% не поймут в твоей области) каждому свое)
@dennis1, к великому сожалению это так, по опыту 95% людей с которыми сталкивался были убеждены что понимают в строительстве и что вообще ничего сложного нет :))))
@Seva2006, опыт иногда преувеличивает.) скорее, как и везде – в действии закон Парето: 80 на 20.))
@Fillosoff, если Вы верите, что везде или даже в большинстве кейсов действует это соотношение “80:20”, то Вы – идиот.
@Fillosoff, вполне может быть и 80, разве этого мало? я сказал образно, потому что практически все кто сталкивается со строительством, не будучи строителем убеждены что все знают и понимают…
@Seva2006, конечно же не мало! и это не только в строительстве так, а в любой области. и все это описывается законом Парето. поэтому, я и написал об этом.)
@Seva2006, так понимать не надо) Надо просто использовать по мере необходимости)
@Ирина Чернова, Что бы использовать надо понимать! А для меня это темный лес
@Seva2006, а зачем понимать, если тысячи готовых регулярок уже написаны? Просто берите и пользуйтесь, когда надо)
@Ирина Чернова, нее спасибо, даже не знаю что такое регулярка, пусть этим занимаются специалисты в этой области, сапожник сделает хорошие туфли, а я лучше построю хорошее здание, не надо лезть туда где ты не разбираешься, как показывает моя практика дилетанты или псевдоспециалисты могут запороть даже самые простейшие, но очень важные моменты которые потом специалистам переделывать сложнее чем сделать с самого начала
@Seva2006, Ваши рассуждения предельно правильны и я не смею в Вами спорить) Но статья просто о готовых рецептах продвинутого поиска в тексте. Чтобы вытащить с веб-страницы номера телефонов или поля таблицы не нужно звать специалистов, так как это секундное дело)
@Ирина Чернова, может быть и так, но опять таки так как я человек старой формации и хоть и пользуюсь айфоном, маком и прочими благами современной цивилизации, вникать в это для меня очень сложно (хотя вполне может быть мне это только кажется), поэтому если я сталкиваюсь с какой то проблемой технического характера у меня есть личный помощник (выпускник бауманки) и трое сыновей которые во всем этом выросли… для меня даже договор читать и вносить правки на мониторе что то катастрофически сложное, мне проще распечатать и красной ручкой править, единственное без чего я не могу во всех этих компьютеризациях это автокад, год меня ему учили и теперь в нем как в своей бумажной записной книжке (в айфоне у меня всего 6 контактов), хотя и так все нужные мне номера и адреса электронных почтовых ящиков помню по памяти, а когда не помню то при наборе первых символов они сами выскакивают
@Seva2006, от всей души Вам завидую:-)
@Seva2006, это всем сложно понять и на это понимание часто уходит не один месяц. Так что действительно проще брать и пользоваться тем, что есть.
@Maxim Velgach, ну вот я и пользуюсь поиском, как указано в самом начале :)
Сокровище настоящее, а не статья.
Ирине аплодисменты!
@Wespe, просто сказка, я сам аж всплакнул
Ваш ресурс превратился в дерьмо, захожу сюда по привычке, по старой памяти …
Реклама хлама и фитодерьмо
можно меня забанить по IP как нибудь, что бы я сюда даже попасть по привычке не мог?
А то каждый раз захожу и искренне растраиваюсь
@iphonesartclehater, а чем Вас расстроили лайфхаки по работе с текстом на Mac?
@Ирина Чернова, Я потребитель, простой потребитель контента и мне раньше нравился ресурс. Я не думаю, что я было или дурак (2 высших, 2 профильных)
Вы умная девушка, судя по статье, работая с цифрами обладаете аналитическим складом ума. Мое расстройство связано с тем, что раньше я сюда приходил и отдыхал, сейчас я прихожу и чувствую себя чужим. Ощущение, что ресурс сузился для очень узкого круга читателей, веги с челками в клетку и определенным обозам жизни.
Список заголовок статей с одной страницы за август 2012
iPhone как подслушивающее устройство
Новые фотографии передней панели iPhone 5
App Store в iOS 6 обзавёлся новым интерфейсом поиска
Foxconn инвестирует в Sharp ради Apple
Новые фотографии «iPhone 5» в сравнении с iPhone 3GS и 4
О производителях дисплеев для «iPhone 5» и «iPad mini»
Неизвестные ранее фотографии Стива Джобса
Обзор скринпротекторов Spigen SGP Steinheil Series для iPhone 5. Хитрый эксперимент
App Store + HD Собеседник HD. Русская ассистентка
Конкурс по Pictorial 2 (собрали)
Каталог подарков Apple 1983 года
App Store + HD Говорящие часы. Слушая время
2016:
Много текста о ненятном, для супер узкого круго людей тусующихся на хабре
Польза от вегетарианства
Реклама пылесоса
Рюкзак
Реклама полатки с наушниками
Качалка + фоточки
@iphonesartclehater, надо же, я думал, что этот ресурс предназначен не для “простых потребителей контента”, а для технически грамотных людей, которые купили айфон не потому что “яблоко – это круто” или для имитации высокого социального статуса. Это технический ресурс, описывающий особенности продукции Apple, и эта статья полезна тем, кому нужна особая обработка текста на Mac. Хотя я регекспами в текстовых редакторах в основном пользуюсь для удаления подряд идущих пробелов (\s+) и тому подобного.
А с рекламой – я с Вами полностью согласен, она порядком надоела, но, к сожалению, она сейчас везде.
@iphonesartclehater, у Ирины интересные и полезные статьи, согласен с Вами, что ресурс с подачи главного редактора) превратился в гавно, но главное что есть хоть кого-то тут почитать! p.s. Вчера в комментах, Бардаша просил помочь с выбором модели iPhone 6s для России, но это чудо даже внимание не обратило.
@iphonesartclehater, большое спасибо за развернутый ответ, буду делать больше легких материалов на тему Apple. Но фишки/инструкций тоже очень нужны. Продвинутый поиск с поддержкой RegExp может пригодиться каждому, кто пользуется текстовыми редакторами (не зря же эта фича даже в Adobe InDesign есть) и полезно иметь общее представление о ее применении.
Я вот очень старалась подать эту статью, чтобы ничем не напрягать читателя: копируешь, вставляешь, получаешь результат. А вышел такой EPIC FAIL.
@Ирина Чернова, все нормально, не переживайте.) кому надо – возьмут и будут пользоваться, и будут благодарны. кому не надо – не всегда молча пройдут. как и везде в жизни.)
Я работаю с клиентами. и каждое утро, приступая к работе, повторяю себе древнюю китайскую мудрость: “Ни сы!” что означает: “Будь безмятежен, словно цветок лотоса у подножия Храма Истины…”))))
@Fillosoff, на самом деле регулярки нужны очень и очень многим людям, и мне жаль что некоторые этого не осознают. Пример: недавно моя мама (54-летний ботаник) потратила целый рабочий день на изменение оформления списка литературы (там сотни источников). А с регулярками справилась бы за 15 минут. Но ко всем автоматизациям у нее отношение как в комментарии twelve + от ручной работы больше моральное удоволетворение.
@Ирина Чернова, можно без конца долго морально удовлетворяться… если время есть.) а когда еще с семьей хочется больше времени проводить, да с друзьями встретиться, да на футбол сходить.. то я предпочитаю быстренькое, технологически усовершенствованное, моральное удовлетвореньеце.))))
@Ирина Чернова, продолжайте делать свое дело! Лично Вы заняли хорошую нишу, несмотря на засилие сплошных рекламщиков на данном ресурсе!
@iphonesartclehater, теперь мы опытным путём пришли к тому, что быдло и дурак не исключают возможности 2 высших, спасибо, улыбнули.
Ирина, вот вроде хорошие статьи выкладываете, но узконаправленные. гораздо проще было бы вступить с основ регекса, строчек на 10-15, и абсолютно всем было бы намного понятнее что например обозначает вот это выражение: “[А-ЯЁ][а-яё]+ [А-ЯЁ][а-яё]+”, ведь каждому было бы понятнее, что это за плюсик.
кстати выражение с IP адресами правильнее было бы записать так же, как вы и записали с временем, ибо появляется 75% погрешность.
@goodhoopoe, пожалуй Вы правы. Но я подумала что кратко о синтаксисе регулярок не расскажешь и это описание заставит читателя закрыть статью, поэтому решила просто показать практическое применение, чтобы вызвать интерес к теме, но это было неверное решение.
норм статья, расширяющая кругозор, дающая почувствовать вкус регулярных выражений;
было бы очень не прикольно, если бы все авторы писали про новый айфон се
@metalhead, :-)
Регулярки рулят, но 99% людей никогда не пригодятся.
Да, спасибо огромное!!! мне как раз надо римские цифры вытаскивать, делать больше вообще в жизни нечего, думай дай поищу в текстах интернета римские цифры
@hairpet, пример когда это бывает надо. Пишите вы курсовую/научную статью. Скопировали туда текстов из разных источников (в одних цифры римские, а в других арабские). Надо сделать так, чтобы везде была традиционная запись. Если глазами искать каждую римскую цифру и переводить ее, то куча усилий будет потрачено в пустоту. А с помощью Regexp их можно все найти в секунду, потом в Excel перевести все сразу в арабские и на VBA скрипт для замены написать (несколько строк). Если текст длинный то времени можно сэкономить порядочно)
Годно, спасибо.
емейл?
Что за ужасы….периферия какая-то что ли статьи пишет.
Автор написала статью сама для себя?
@Vizakenjack, да и для себя тоже.
@Ирина Чернова, есть такой код только для MAC адреса??
Добрый день, есть такой код только для MAC адреса??
@Andrey334, ^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$
@Andrey334, еще можно воспользоваться онлайн-сервисом для извлечения mac-адресов из текста воспользоваться. https://en.toolpage.org/tool/mac-extractor
@Ирина Чернова, Огромное спасибо) Очень помогли)
Нашли орфографическую ошибку в новости?
Выделите ее мышью и нажмите Ctrl+Enter.В iPhone начались проблемы с аудиовызовами, что сделать
Как на Mac включить отображение строки меню в полноэкранном режиме
Что делать, если Siri не распознает голос
Проблемы с обновлением приложений на Mac
Потерял (украли) iPhone — что делать? Порядок действий
Что делать, если мышь «прилипает» к кнопкам в iOS
Как мониторить расход мобильного трафика на iPhone
Почему в Safari на iPhone появляется ошибка «Этот сайт заблокирован от автоматического инициирования вызова»