| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [C++] Странное поведение RexExp'ов |
| Автор: BukeMan 15.11.2010, 10:39 | ||||
| Здравствуйте! Прошу вас помощи разобраться в чем проблема моего использования regex. Есть у меня такая функция:
как вы можете видеть, она находит email адрес в заданной строке. но, увы она не всегда выдает корректный результат. например при подаче на вход строки типа:
оно мне выдаст: [email protected] Web вместо корректного [email protected] Подскажите пожалуйста в каком месте баг, и как мне сделать так, что б оно НЕ включало в результат поиска что-либо после домена верхнего уровня. |
| Автор: t_gran 16.11.2010, 03:52 |
| BukeMan, у вас ошибка в самом регулярном выражении: [A-Za-z0-9._%-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4} Вспоминайте, что такое точка в свободном виде? Правильно, любой символ. Вот и получается, что у вас в вашем случае любой символ это пробел. Наверное нужно было вот так: [A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]{2,4} |
| Автор: BukeMan 16.11.2010, 12:02 |
| t_gran, спасибо Вам большое! действительно после взятия точки в квадратные скобки результат поиска выдает верно. Я еще не сильно разобрался в регулярных выражениях, т.к. не могу найти толкового хелпа... в MSDN VS2008 там вообще примеры очень скудные. Если Вам не трудно, помогите пожалуйста еще по двум вопросам касающимся регулярных выражений. 1) как задать маску так, что б в качестве первого символа email принимались только буквы? дело в том, что если перед адресом будет какой-либо из символов ( - . _ ), то вышеуказанная маска ("[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]{2,4}") включит их в результат поиска. например: при подаче на вход строки "some text [email protected] something else" результатом будет: [email protected] реально ли задать маску таким образом, что б результат был: [email protected] 2) и второй вопрос: как можно продолжить поиск в текущей строке? нипример если найдено совпадение, но в данной строке есть еще один email... |
| Автор: ИванМ 18.11.2010, 19:46 | ||||
^ - начало строки $ - конец строки \. - точка * - ноль или больше символов Добавлено @ 19:54 Только для такого выражения лучше использовать regex_match. А для того, что бы найти несколько e-mail, нужно пользоваться как раз regex_search.
Но тогда начало и конец строки не проверить. Нужно еще раз проверять перед началом поиска на начало и конец. |