Статьи

Обычные выражения

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

fhd% 3A Удивительно, сколько реальных разработчиков не знают регулярных выражений.  Это как плотники, которые не знают о молотках.

Как вы уже догадались, я рассматриваю регулярные выражения как фундаментальный элемент инструментария каждого программиста. Тем не менее, я не очень хорошо разбираюсь в метафорах , и я не знаю ничего о плотницких работах, поэтому молоток  упустил суть. Томас Феррис Николаизен нашел лучшую аналогию:

tfnico% 3A% 40fhd Я бы сказал, это как плотники, которые не знают дисковых пил% 3B)

Он прав: регулярные выражения — это специализированный способ работы с текстом, в основном это касается программистов — не всех, кто работает с текстом в целом.

В большинстве других ответов, которые я получил, указывалось, что, хотя они знали (или когда-то знали) регулярные выражения, в настоящее время они редко используют его. Я думаю, это позор, поэтому я решил ежедневно делиться тем, что я делаю с регулярными выражениями, может быть, вы найдете это полезным. Я иногда использую их в коде, но то, что я делаю все время, использую ли я редактор или IDE, — это поиск и замена. Если вы совсем не знакомы с регулярными выражениями, я предлагаю эту ссылку для понимания оставшейся части этого поста.

Поиск

Я иногда упоминаю, что я вырос на UNIX, и это правда. Первым, что я узнал о программировании, было то, как использовать инструменты командной строки Linux, такие как  grep , которая является командой, которая позволяет вам искать содержимое одного или нескольких файлов с помощью регулярного выражения.

Я не могу придумать убедительный пример, потому что я в основном использую поиск по регулярным выражениям в сочетании с заменой, редко в одиночку. Но представьте, что вы пытаетесь найти определенную строку в JavaScript, но забыли, какой разделитель строк (‘или “) вы использовали. Вот команда grep:

grep -R "[\"']Some string[\"']" /path/to/your/webapp

Естественно, вам не нужно отращивать бороду и становиться фанатом CLI, чтобы использовать возможности поиска по регулярным выражениям, вот как вы делаете то же самое в Eclipse:

Поиск по регулярному выражению в 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 (выберите строки, к которым вы хотите применить это, прежде чем открывать диалог поиска / замены):

Поиск и замена регулярных выражений в Eclipse

Выражение может выглядеть немного пугающим, если вы не привыкли к регулярным выражениям, но вы сможете записать что-то подобное в кратчайшие сроки, если будете их практиковать.

Если вам интересно, это также возможно в командной строке с помощью  команды sed .

Вывод

Регулярные выражения — это мощный инструмент для обработки и редактирования текста, автоматизированный или интерактивный. Если вы используете их по привычке, вы научитесь чему-то на всю жизнь, потому что каждый разумный редактор и IDE их поддерживают. Однако регулярные выражения не стандартизированы, поэтому между Perl, Java и т. Д. Есть небольшие различия. Вы могли заметить, что в grep и Eclipse в первом примере выше также есть небольшие отличия. Это иногда хорошо для небольшого количества путаницы, но это никогда не вредило моей производительности особенно.

Говоря о производительности; хотя регулярные выражения, вероятно, не заставят вас писать код быстрее, они могут значительно увеличить скорость рефакторинга, над чем я работаю большую часть времени. Сколько времени вы тратите на написание кода? И сколько времени вы тратите на редактирование существующего кода? Я думаю, что соотношение составляет не менее 1:10 в моем случае. Если вы сможете быстро выполнить рефакторинг, вы будете проводить рефакторинг чаще, что, вероятно, улучшит дизайн и удобство сопровождения вашего кода.

Однако если вы решите игнорировать регулярные выражения до тех пор, пока не найдете ситуацию, в которой они действительно вам нужны (что может никогда не произойти, вы всегда можете найти обходной путь), вы входите в цикл отрицательной обратной связи: вы не очень знакомы с ними Поэтому, если вы столкнулись с проблемами, они не приходят вам на ум и вы ими не пользуетесь. Если вы не используете их регулярно, вы никогда не познакомитесь с ними. Поиск и замена — идеальный способ разорвать этот цикл, поэтому я предлагаю вам попробовать.

 

С http://ubercode.de/blog/regular-expressions