Помощь с регулярным выражением - соответствие адреса электронной почты - PullRequest
0 голосов
/ 26 августа 2010

У меня есть следующее регулярное выражение, которое предполагает совпадение адресов электронной почты:

[a-z0-9!#$%&'*+\\-/=?^_`{|}~][a-z0-9!#$%&'*+\\-/=?^_`{|}~.]{0,63}@[a-z0-9][a-z0-9\\-]*[a-z0-9](\\.[a-z0-9][a-z0-9\\-]*[a-z0-9])+$.

У меня есть следующий код в AS3:

var mails:Array = str.toLowerCase().match(pattern);

(шаблон RegExp с упомянутым регулярным выражением).

Я получаю два результата, когда str равно gaga@example.com:

  1. gaga@example.com
  2. .com

Почему?

Ответы [ 5 ]

3 голосов
/ 26 августа 2010

.com был захвачен последней частью регулярного выражения (\\.[a-z0-9][a-z0-9\\-]*[a-z0-9]).

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

Например, регулярное выражение 0x([0-9a-fA-F]) будет соответствоватьшестнадцатеричное число в форме 0x9F34 и захват шестнадцатеричной части в отдельной группе.

1 голос
/ 26 августа 2010

gaga@example.com - совпадение всего регулярного выражения, а .com - последнее совпадение первой группы ((\\.[a-z0-9][a-z0-9\\-]*[a-z0-9])).

1 голос
/ 26 августа 2010

Я не уверен насчет вашего регулярного выражения, есть хорошее руководство по проверке электронной почты здесь .

Для меня это звучит так:

[a-z0-9!#$%&'*+\-/=?^_{|}~]           # single of chosen character set
[a-z0-9!#$%&'*+\\-/=?^_{|}~.]{0,63}   # any of chosen character set with the addition of , \
@
[a-z0-9]                              # single alpha numeric
[a-z0-9\-]*                           # any alphanumeric with the addition of -
a-z                                   # single alphabetical
0-9+                                  # at least one number
$                                     # end of line
.                                     # any character

Относительно того, почему вы получаете две подстроки в массиве, потому что обе соответствуют шаблону - см. Документы

0 голосов
/ 26 августа 2010

Чтобы добавить к тому, что сказали другие:

Есть два результата, потому что он соответствует как целому адресу электронной почты, так и последней группе, заключенной в скобки.

Если вы не хотитегруппу, которую вы хотите захватить, вы можете добавить ?: в начало группы.В документации AS можно найти группы без захвата:

http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/js/html/wwhelp.htm?href=00000118.html#wp129703

"Группа без захвата - это группа, которая используется только для группировки; она не" собрана "и несоответствовать пронумерованным обратным ссылкам. Используйте (?: and) для определения групп без захвата следующим образом:

var pattern = /(?:com|org|net)/; "

0 голосов
/ 26 августа 2010
([a-z0-9!#$%&'*+\\-/=?^_`{|}~][a-z0-9!#$%&'*+\\-/=?^_`{|}~.]{0,63}@[a-z0-9\\-]*[a-z0-9]+\\.([a-z0-9\\-]*[a-z0-9]))+$

Кажется, это работает как ожидалось (протестировано в Regex Tester).Удалена последняя группа захвата.

...