Ранее в этом месяце я выразил свое удивление по поводу того, что большинство разработчиков программного обеспечения, с которыми я работал в течение последних семи лет, не знают в первую очередь регулярных выражений:
Как вы уже догадались, я рассматриваю регулярные выражения как фундаментальный элемент инструментария каждого программиста. Тем не менее, я не очень хорошо разбираюсь в метафорах , и я не знаю ничего о плотницких работах, поэтому молоток упустил суть. Томас Феррис Николаизен нашел лучшую аналогию:
Он прав: регулярные выражения — это специализированный способ работы с текстом, в основном это касается программистов — не всех, кто работает с текстом в целом.
В большинстве других ответов, которые я получил, указывалось, что, хотя они знали (или когда-то знали) регулярные выражения, в настоящее время они редко используют его. Я думаю, это позор, поэтому я решил ежедневно делиться тем, что я делаю с регулярными выражениями, может быть, вы найдете это полезным. Я иногда использую их в коде, но то, что я делаю все время, использую ли я редактор или IDE, — это поиск и замена. Если вы совсем не знакомы с регулярными выражениями, я предлагаю эту ссылку для понимания оставшейся части этого поста.
Поиск
Я иногда упоминаю, что я вырос на UNIX, и это правда. Первым, что я узнал о программировании, было то, как использовать инструменты командной строки Linux, такие как grep , которая является командой, которая позволяет вам искать содержимое одного или нескольких файлов с помощью регулярного выражения.
Я не могу придумать убедительный пример, потому что я в основном использую поиск по регулярным выражениям в сочетании с заменой, редко в одиночку. Но представьте, что вы пытаетесь найти определенную строку в JavaScript, но забыли, какой разделитель строк (‘или “) вы использовали. Вот команда grep:
grep -R "[\"']Some string[\"']" /path/to/your/webapp
Естественно, вам не нужно отращивать бороду и становиться фанатом CLI, чтобы использовать возможности поиска по регулярным выражениям, вот как вы делаете то же самое в Eclipse:
Замена
Как упомянуто выше, я использую регулярные выражения в основном для поиска и замены, очень мощного метода, который избавил меня от бесчисленных часов бессмысленного повторяющегося набора текста. Вы когда-нибудь слышали, чтобы коллега издавал один и тот же звук клавиатуры много раз подряд? Как перемещение курсора на следующую строку, размещение его в начале и нажатие клавиш CTRL + V ? Я ленивый человек, и я терпеть не могу повторяющихся задач печатать. К счастью, вы можете избежать большинства из них с помощью регулярных выражений.
Вот пример того, как поиск и замена регулярных выражений ускоряет рефакторинг. У нас было много тестов, которые выглядели так:
assertThat(RomanNumerals.convert(1), is("I"); ... assertThat(RomanNumerals.convert(5), is("V"); ... assertThat(RomanNumerals.convert(10), is("X");
Слишком много дублирования, поэтому мы создали метод assertRomanNumeralEquals (), чтобы избавиться от этого:
private static void assertRomanNumeralEquals(String roman, int arab) { assertThat(RomanNumerals.convert(arab), is(roman)); }
Eclipse смог извлечь метод для нас, но не смог заставить все вызовы assertThat () использовать новый метод. Так что вот где замена регулярных выражений оказывается полезной даже в сложной IDE. Я заменил следующее выражение:
assertThat\(RomanNumerals.convert\((.*)\),\ is\((".*")\)\);
С этим:
assertThatRomanNumeralEquals(\2, \1);
Вот как это выглядит в Eclipse (выберите строки, к которым вы хотите применить это, прежде чем открывать диалог поиска / замены):
Выражение может выглядеть немного пугающим, если вы не привыкли к регулярным выражениям, но вы сможете записать что-то подобное в кратчайшие сроки, если будете их практиковать.
Если вам интересно, это также возможно в командной строке с помощью команды sed .
Вывод
Регулярные выражения — это мощный инструмент для обработки и редактирования текста, автоматизированный или интерактивный. Если вы используете их по привычке, вы научитесь чему-то на всю жизнь, потому что каждый разумный редактор и IDE их поддерживают. Однако регулярные выражения не стандартизированы, поэтому между Perl, Java и т. Д. Есть небольшие различия. Вы могли заметить, что в grep и Eclipse в первом примере выше также есть небольшие отличия. Это иногда хорошо для небольшого количества путаницы, но это никогда не вредило моей производительности особенно.
Говоря о производительности; хотя регулярные выражения, вероятно, не заставят вас писать код быстрее, они могут значительно увеличить скорость рефакторинга, над чем я работаю большую часть времени. Сколько времени вы тратите на написание кода? И сколько времени вы тратите на редактирование существующего кода? Я думаю, что соотношение составляет не менее 1:10 в моем случае. Если вы сможете быстро выполнить рефакторинг, вы будете проводить рефакторинг чаще, что, вероятно, улучшит дизайн и удобство сопровождения вашего кода.
Однако если вы решите игнорировать регулярные выражения до тех пор, пока не найдете ситуацию, в которой они действительно вам нужны (что может никогда не произойти, вы всегда можете найти обходной путь), вы входите в цикл отрицательной обратной связи: вы не очень знакомы с ними Поэтому, если вы столкнулись с проблемами, они не приходят вам на ум и вы ими не пользуетесь. Если вы не используете их регулярно, вы никогда не познакомитесь с ними. Поиск и замена — идеальный способ разорвать этот цикл, поэтому я предлагаю вам попробовать.