Помогите составить регулярное выражение - PullRequest
1 голос
/ 12 марта 2011

У меня есть следующая строка: user1 fam <user@example.com>, user2 fam <user2@example.com>, ...

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

user@example.com
uesr2@example.com

Я пытаюсь:

<.*>

Но это вывод с <>:

   <user@example.com>
   <uesr2@example.com>

Спасибо.

p.s. Спасибо @xanatos за комментарий, я использую Erlang

Ответы [ 4 ]

4 голосов
/ 12 марта 2011

Как сказал другой, но чтобы сделать это быстрее:

<([^>]*)>

Таким образом, регулярное выражение не должно будет возвращаться (с другими предложенными регулярными выражениями регулярное выражение будет соответствовать всей строке изатем начнется откат, чтобы найти >)

Я добавлю, что по историческим причинам между . и, например, [\s\S] есть небольшие различия.Оба поймали всех персонажей, кроме \n.Первый (.) не улавливает это.Таким образом, используя [^>], вы ловите \n, но это не должно быть проблемой для того, что вы делаете.http://www.regular -expressions.info / dot.html

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

<((?:(?!>).)*)>

(вы можете заменить . на [\s\S], если хотите, или использовать опцию SingleLine, если ваш язык поддерживает это, чтобы . вел себя по-другому).Дело в том, что выражение «стоп» может быть длиннее одного символа.Вместо (?!>) Вы могли бы вставить (?!%%), и он остановился бы на %%.НО я не уверен, что этот вариант работает с Erlang (я не заметил новый тег ... Его не было, когда я первоначально прочитал вопрос, и я не программист Erlang ... И, по крайней мере, кажется,два программиста Erlang имеют разные мнения по поводу аргумента :-))

1 голос
/ 13 марта 2011

Сохраняйте это простым и используйте <([^>]*)>, который настолько быстр, насколько это возможно, и работает для большинства версий регулярных выражений. Это быстрее, так как никогда не нужно возвращаться назад при использовании <(.*?)> будет вызывать возврат.

1 голос
/ 12 марта 2011
  • Вам необходимо использовать опцию ungreedy, чтобы она соответствовала только отдельным парам скобок.

  • global, чтобы вы могли получить всесоответствует.

  • , и вам нужно {capture, all_but_first, list}, чтобы получить действительные значения (list также может быть binary, если вы предпочитаете двоичные результаты).all_but_first говорит re не возвращать все совпадения (включая <>), только группу.

Результат:

1> S.
"user1 fam <user@example.com>, user2 fam <user2@example.com>, "
2> re:run(S, "<(.+)>", [ungreedy, global, {capture, all_but_first, list}]).
{match,[["user@example.com"],["user2@example.com"]]}
1 голос
/ 12 марта 2011

Использование групп.Обратитесь к документации вашего движка регулярных выражений для получения более подробной информации.

>>> re.findall('<(.*?)>', 'user1 fam <user@example.com>, user2 fam <user2@example.com>, ...')
['user@example.com', 'user2@example.com']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...