Что не так с этим Regex - PullRequest
0 голосов
/ 28 июня 2010

Я использую ^[\w-\.\+]+@([\w-]+\.)+[\w-]{2,4}$ для проверки адреса электронной почты, когда я использую его из .aspx.cs, он отлично работает для проверки электронной почты IDN, но когда я использую его со страницы aspx напрямую, он не работает.

return  Regex.IsMatch(
                email,
                @"^[\w-\.\+]+@([\w-]+\.)+[\w-]{2,4}$",
                RegexOptions.Singleline);

удостоверение личности, которое я хотел бы проверить, выглядит как pelai@ÖßÜÄÖ.com

Я слишком плох в регулярных выражениях. Ребята, вы знаете, что я делаю не так?

Ответы [ 5 ]

3 голосов
/ 28 июня 2010

Возможно, вы захотите взглянуть на regexlib.com, у них есть фантастический выбор контента, созданного пользователем, для выполнения этих чрезвычайно простых типов совпадений.

http://regexlib.com/Search.aspx?k=email

2 голосов
/ 28 июня 2010

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

Edit (после просмотра вашего кода): убедитесь, что проверяемая строкабез пробелов и тому подобное?Поместите точку останова прямо там и осмотрите строку, которая может дать вам представление о том, что идет не так.

1 голос
/ 28 июня 2010

Вы должны избегать тире (-) в первом классе символов и не нужно указывать точку и плюс:

[\w\-.+]

или

[\w.+-]

нет необходимости экранировать тире, если этопоследний символ.

0 голосов
/ 28 июня 2010

Проблема заключается в тех символах, не являющихся ASCII, в вашем тестовом адресе, ÖßÜÄÖ (о которых вы когда-либо упоминали только в комментарии к ответу @ HansKesting). В .NET \w соответствует всем буквам и цифрам Unicode и даже нескольким символам, кроме _, которые классифицируются как , соединяющие пунктуацию , но в JavaScript это соответствует только [A-Za-z0-9_].

В JavaScript также отсутствует поддержка свойств Юникода (например, \p{L} для букв) и блоков (\p{IsLatin}), поэтому вам придется перечислять любые не-ASCII-символы, которые вы хотите разрешить с помощью их экранирования Юникода (\uXXXX) , Если вы просто хотите поддерживать буквы Latin1, я думаю, вы могли бы использовать [\w\u00C0-\u00FF], но IDN должен поддерживать больше, чем просто Latin1, не так ли?

Кстати, JavaScript также не поддерживает однострочный режим, и даже если бы он это сделал, вы бы не смогли его использовать. JS поддерживает режимы Multiline и IgnoreCase, но нет возможности установить их как на стороне сервера, так и на стороне клиента. Встроенные модификаторы (?i) и (?m) не работают в JS, а аргумент RegexOptions работает только на стороне сервера.

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

0 голосов
/ 28 июня 2010

С помощью "непосредственно со страницы aspx" вы, вероятно, имеете в виду валидатор регулярных выражений?

Тогда вам нужно знать, что регулярное выражение используется другой системой: javascript, которая имеет собственную реализацию регулярного выражения.Это означает, что регулярные выражения, которые работают в .Net напрямую, могут потерпеть неудачу в js.

Реализации не слишком отличаются, основы идентичны.Но могут быть различия в деталях (например, как обрабатывается unescaped -), и js не хватает некоторых «расширенных возможностей» (хотя ваше регулярное выражение не выглядит слишком «продвинутым» ;-)).

Видите ли выкакие-либо сообщения об ошибках в браузере?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...