Почему люди используют регулярные выражения для электронной почты и других сложных проверок?

Запишите свои цифры, затем используйте их при замене:

(\d)\s(?=\d)

заменить на:

$1:

В следующем примере используется JavaScript:

var str = '00 04 02 01';
str = str.replace(/(\d)\s(?=\d)/g, '$1:');

Вот скрипка: http://jsfiddle.net/7arUa/

13
задан Community 23 May 2017 в 11:45
поделиться

12 ответов

Они делают это, потому что они видят, что "Я хочу протестировать, соответствует ли этот текст спецификации", и сразу думайте, что "Я знаю, я буду использовать regex!" полностью не понимая сложности спецификации или ограничений regexes. Regexes являются замечательным, мощным инструментом для обработки большого разнообразия соответствующих тексту задач, но они не идеальный инструмент для каждой такой задачи, и кажется, что многие люди, которые используют их, теряют из виду тот факт.

25
ответ дан Dave Sherohman 23 May 2017 в 11:45
поделиться
  • 1
    После беглого взгляда по Zend\Db\Adapter\AdapterServiceFactory I don' t думают так. – yechabbi 15 March 2013 в 20:36

Regexs, которые ловят большинство (но не все) распространенная ошибка, относительно легко установить и развернуться. Занимает больше времени для записи пользовательского синтаксического анализатора.

8
ответ дан Brian Knoblauch 23 May 2017 в 11:45
поделиться

Люди используют regexes для адресов электронной почты, HTML, XML, и т.д. потому что:

  1. Это взгляды как они должны работать, и они часто делают работа для очевидных случаев.
  2. Они "знают" регулярные выражения. Когда все, что Вы имеете, является молотком, все Ваши проблемы похожи на гвозди.
  3. Запись синтаксического анализатора более трудна (или кажется более твердым), чем запись регулярного выражения. В частности, запись синтаксического анализатора более трудна, чем запись regex, который обрабатывает очевидные случаи в № 1.
  4. , Они не понимают полной сложности задачи.
  5. Они не понимают ограничения регулярных выражений.
  6. Они запускают с regex, который обрабатывает очевидные случаи, и затем попытайтесь расширить его для обработки других. Они заблокированы в один подход.
  7. Они не знают, что существует (вероятно), библиотека, доступная, чтобы сделать работу для них.
3
ответ дан Michael Carman 23 May 2017 в 11:45
поделиться

Используя регулярные выражения для этого не хорошая идея, как был продемонстрирован подробно в тех других сообщениях.

я предполагаю, что люди продолжают делать его, потому что они не знают ничего лучшего или не заботятся.

синтаксический анализатор будет немного лучше? Возможно, возможно, нет.

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

кроме того, быть осторожными с этим ваша схема проверки TLD, Вы могли бы найти, что Вы принятие слишком много о том, что позволяется в TLD.

4
ответ дан Chris Vest 23 May 2017 в 11:45
поделиться
  • 1
    Я думаю, что @v2p решение очень изящно, по-моему. Это - то, о чем JavaScript - все. – Chaitanya 1 May 2013 в 22:35

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

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

Одна потребность иметь библиотеку, которая облегчает писать синтаксические анализаторы непосредственно на языке X (где 'X' C, C++, C#, Java) быть в состоянии создать пользовательские синтаксические анализаторы с той же простотой как регулярное выражение matchers.

Такие библиотеки, порожденные на функциональной земле (Haskell и ML), но в наше время "синтаксический анализатор combinators библиотеки", существуют для Java, C++, C#, Scala и других основных языков.

3
ответ дан ADEpt 23 May 2017 в 11:45
поделиться

Искушение использования RegExp, как только Вы освоили основы, является очень большим. На самом деле RegExp кажется столь мощным, что люди естественно хотят начать использовать его везде. Я действительно подозреваю, что существует большая психология, включенная здесь, как продемонстрировано Randall комик XKCD (и да, это полезно).

я сделал вводное представление RegExp однажды, и самый важный слайд предостерег от своего злоупотребления. Это был единственный слайд, который использовал полужирный шрифт. Я полагаю, что это должно делаться чаще.

Everybody stand back!

8
ответ дан Community 23 May 2017 в 11:45
поделиться
  • 1
    да у меня уже была эта версия, но я надеялся на более изящный способ сделать это. но спасибо так или иначе – Safari 19 March 2012 в 16:55

и затем проверяет, те против допустимых символов допускали имя (нет никакой дальнейшей проверки, которая может быть сделана на этой части)

, Это не верно. Например, "ben..doom@gmail.com" содержит только допустимые символы в разделе имени, но не действителен.

На языках, которые не имеют библиотек для почтовой проверки, я обычно использую regex becasue

  1. , я знаю regex и нахожу его простым в использовании
  2. , у меня есть многие друзья, которые знают regex, и я могу сотрудничать с
  3. , Это быстро для меня для кодирования, и меня разовый является более дорогим, чем процессорное время для большинства приложений
  4. Для большинства адресов электронной почты, это работает.

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

3
ответ дан Ben Doom 23 May 2017 в 11:45
поделиться
  • 1
    Да, это работает. IMO это - лучшее решение. – John Livermore 3 June 2014 в 14:56

Regexps намного быстрее для использования, конечно, и они только проверяют то, что определяется в RFC. Записать пользовательский синтаксический анализатор? Что? Требуется 10 секунд для использования regexp.

-3
ответ дан Terminus 23 May 2017 в 11:45
поделиться

Люди пишут регулярные выражения потому что большинство разработчиков как, так решите простую проблему самым "прохладным" en "эффективным" способом (что означает, что это должно быть максимально нечитабельно).

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

Как Jamie Zawinski сказал в 1997: "Некоторые люди, когда столкнуто с проблемой, думают, что "Я знаю, я буду использовать регулярные выражения". Теперь у них есть две проблемы".

1
ответ дан Rolf 23 May 2017 в 11:45
поделиться
  • 1
    Любое содержание, которое не является кодом Ветки, должно быть в блоке Ветки. – Frederik Krautwald 8 September 2013 в 20:06

Я не полагаю, что корректная почтовая проверка может быть сделана с единственным регулярным выражением (теперь существует проблема!). Одна из проблем - то, что комментарии могут быть вложены к произвольной глубине и в локальной части и в домене.

, Если Вы хотите проверить адрес против RFCs 5322 и 5321 (текущие стандарты) тогда, Вам будет нужна процедурная функция, чтобы сделать так.

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

Выезд некоторые альтернативы здесь: http://www.dominicsayers.com/isemail/

, Если Вы знаете другой функции, что я могу добавить к лицом к лицу, сообщить мне.

3
ответ дан Dominic Sayers 23 May 2017 в 21:45
поделиться
  • 1
    <li data-bind="css: { active: navTab.isActive }, click: function(){alert(1)}, click: function(){alert(2)}"> только предупреждения " 2". Ваш работы, потому что его регистрация Вашего первого click и перезапись его со вторым. Если Вы возвращаетесь function из " viewMode.bind(...) " Вы не можете ожидать, что он назовет его. – Cody 19 June 2014 в 17:24

We're just looking for a fast way to see if the email address is valid so that we can warn the user they have made a mistake or prevent people from entering junk easily. Going off to the mail server and fingering it is slow and unreliable. The only real way to be sure is to get a confirmation email, but the problem is only to give a fast response to the user before the confirmation process takes place. That's why it's not so important to be strictly compliant. Anyway, it's a challenge and it's fun.

2
ответ дан 1 December 2019 в 17:25
поделиться

On factor: the set of people who understand how to write a regular expression is very much larger than the set of people who understand the formal constraints on regular languages. Same goes for non-regular "regular expressions".

1
ответ дан 1 December 2019 в 17:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: