Если вам интересно, почему этот вопрос вызывает так мало активности, это потому, что есть много других проблем, с которыми нужно разобраться, прежде чем вы начнете думать о производительности. Главным среди них является то, следует ли вам вообще использовать регулярные выражения для проверки адресов электронной почты - и единодушным является то, что вам не следует. Это намного сложнее, чем большинство людей ожидают, и, возможно, в любом случае бессмысленно.
Другая проблема заключается в том, что ваши два регулярных выражения сильно различаются по типам строк, которые могут им соответствовать. Например, второй закреплен на обоих концах, но первый - нет; он будет соответствовать ">>>>foo@bar.com<<<<
", потому что в нем есть что-то похожее на адрес электронной почты. Может быть, каркас заставляет регулярное выражение совпадать со всей строкой, но если это так, почему второй привязывается?
Другое отличие состоит в том, что первое регулярное выражение использует \w
, в то время как второе использует [0-9a-zA-Z]
во многих местах. В большинстве разновидностей регулярных выражений \w
соответствует символу подчеркивания в дополнение к буквам и цифрам, но в некоторых (включая .NET) он также соответствует буквам и цифрам из всех систем записи, известных Unicode.
Есть много других отличий, но это академическое; ни одно из этих регулярных выражений не очень хорошо. См. здесь для хорошего обсуждения темы и гораздо лучшего выражения.
Возвращаясь к исходному вопросу, я не вижу проблемы производительности ни с одним из этих регулярных выражений. Помимо паттерна вложенных квантификаторов, упомянутого в этой записи блога BCL, следует также следить за ситуациями, когда две или более смежные части регулярного выражения могут совпадать с одним и тем же набором символов - например,
([A-Za-z]+|\w+)@
Ничего подобного нет ни в одном из приведенных вами регулярных выражений. Части, которые контролируются квантификаторами, всегда разбиваются другими частями, которые не определены количественно. Оба регулярных выражения будут испытывать некоторый возможный возврат назад, но есть много более веских причин, чем производительность, чтобы отклонить их.
РЕДАКТИРОВАТЬ: Таким образом, второе регулярное выражение является подлежит катастрофической откат назад; Я должен был тщательно проверить это, прежде чем откусить мне рот. Присмотревшись к этому регулярному выражению, я не понимаю, зачем вам нужна внешняя звездочка в первой части:
[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*
Все, что делает этот бит, - это убедиться, что первый и последний символы являются буквенно-цифровыми, а некоторые дополнительные символы между ними. Эта версия делает то же самое, но она терпит неудачу намного быстрее, когда никакое совпадение невозможно:
[0-9a-zA-Z][-.\w]*[0-9a-zA-Z]
Этого, вероятно, будет достаточно для устранения проблемы с возвратом, но вы также можете сделать деталь после "@" более эффективной, используя атомарную группу:
(?>(?:[0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+)[a-zA-Z]{2,9}
Другими словами, если вы сопоставили все, что могли, из подстрок, которые выглядят как компоненты домена, с конечными точками, а следующая часть не выглядит как TLD, не беспокойтесь о возврате. Первый символ, от которого вам придется отказаться, - это последняя точка, и вы знаете, что [a-zA-Z]{2,9}
не будет соответствовать этому.