2012-03-19 2 views
1

Я пытаюсь написать код, который будет RegEx извлекать электронные письма, которые приходят во многих формах:RegEx, чтобы соответствовать по электронной почте также соответствует URL-

[email protected], [email protected], пользователь в домен точка ком, пользователь (в) домен точка ком

Вот мой выстрел (наивный я знаю):

(\w+)\s*(?:@?|(at)?|(\s*at\s*)?|(\(at\))?)\s*(\w+(?:\.|\s*dot\s*)){1,}com 

то соответствует тому, что я хочу, но он также соответствует URL. Как исключить сопоставление URL-адресов?

+2

Google! Требуется меньше шести секунд, чтобы найти один '\ b [A-Z0-9 ._% + -] + @ [A-Z0-9 .-] + \. [AZ] {2,4} \ b' Все вам нужно отредактировать '' 'часть с вашими параметрами. – Nishant

+0

@Nishant, если он заменил '?' В этом регулярном выражении своей существующей группой, он тоже его сломает - одна из его больших ошибок находится в этом разделе. –

+0

@Nishant Правда, но я хочу научиться делать это вручную и раскрывать свои ошибки. Я не ищу рецепт. – Chiron

ответ

0

Рассмотрите этот элемент:

(?:@?|(at)?|(\s*at\s*)?|(\(at\))?) 

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

Поскольку вы уже отделяете ветви с помощью |, вам не нужно ? s, чтобы отметить отдельную ветку как ненужную - только один из них должен соответствовать, но этот не должен быть необязательным.

0

Я думаю, что эту часть

(\w+(?:\.|\s*dot\s*)) 

отвечает за согласование URL.

0

Ваша проблема в группе не-захвата (?:@?|(at)?|(\s*at\s*)?|((at))?). Со всеми ? с, вы сделали любой матч полностью необязательным. Заменить эту часть следующим образом:

(?:@|at|\(at\)) 
Смежные вопросы