Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / RegExp. Проверка нескольких e-mail в одной строке / 15 сообщений из 15, страница 1 из 1
29.07.2009, 13:06
    #36115366
Sevolod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
Всем добрый день!
Вопрос по регулярным выражениям . Есть строка, которая содержит несколько e-mail. Почему, когда они разделены символом ";" и строка не содержит пробелов, то метод Test возвращает True ( маска ^[a-zA-Z0-9.-_]+@[a-zA-Z0-9.-]+\.\w\w+$ )? А если разделитель не ";" или в строке есть пробелы, то метод Test возвращает False.

То есть для строки "A@rbc.ru;B@rbc.ru" вернется True, а для строки "A@rbc.ru; B@rbc.ru" - false. Код примерно такой.

Код: plaintext
1.
2.
3.
     
     RegExp.Global = True
     RegExp.Pattern = "^[a-zA-Z0-9.-_]+@[a-zA-Z0-9.-]+\.\w\w+$"
     RegExp.Test(sStr) 
...
Рейтинг: 0 / 0
29.07.2009, 19:17
    #36116447
Krasnaja Shapka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
у меня получилось что-то типа
Код: plaintext
^(([a-z0-9_\.\-]+)\@(([a-z0- 9 \-]+\.)+)([a-z]+)(;(\s){ 0 ,})?)+$
тока оно также хавает адреса соединенные вообще без никаких точек с запятой, типа:
"name@domain.comname@domain.com"

ваш же вариант вообще хавает конец мейла с цифрами (newtest@hotmail.com1), не воспринимает мейл с черточкой (Fred-Blogss@yahoo.com)
...
Рейтинг: 0 / 0
29.07.2009, 23:23
    #36116673
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
SevolodПочему, когда они разделены символом ";" и строка не содержит пробелов, то метод Test возвращает TrueПочему, почему... ошибка в шаблоне потому что. Тебе что надо сделать то? Узнать несколько в строке почтовых адресов или один? Тогда шаблон должен быть примерно таким:
Код: plaintext
1.
re.Pattern = "[a-zA-Z0-9.-_]+@[a-zA-Z0-9.-]+\s*;\s*[a-zA-Z0-9.-_]+@[a-zA-Z0-9.-]+"
Это тебе даст true только в том случае если у тебя есть как минимум два адреса разделенные через точку с запятой, причем сколько там пробелов вокруг разделителя - не важно.
...
Рейтинг: 0 / 0
30.07.2009, 09:44
    #36117003
Sevolod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
Спасибо!

Krasnaja Shapka , шаблон не я придумал. Понятно, что его можно поменять. Просто сначала хочется понять, почему он работает именно так.

White Owl ,

А в чем именно ошибка в шаблоне? Ведь в шаблоне нет ни одной точки с запятой. Почему VBScript считает валидной строку e-mail, разделенную именно этими разделителями.

Задача - сказать все ли e-mailы валидны в строке.
...
Рейтинг: 0 / 0
30.07.2009, 17:40
    #36118715
Krasnaja Shapka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
Sevolod
А в чем именно ошибка в шаблоне? Ведь в шаблоне нет ни одной точки с запятой. Почему VBScript считает валидной строку e-mail, разделенную именно этими разделителями.
а почему вы считаете, что ваш шаблон считает валидной строку e-mail, разделенную именно этими разделителями? он хавает даже слеши и вообще все что угодно....
ибо у вас вначале присутствует "." - точка, а она без слеша автор Соответствует любому отдельному знаку, кроме "\n". посему и у вас и у White Owl - неправильная строка получается...

надо пихать в первых квадратных скобках вместо "." - "\." ну и попутно третью черту "-" надо тоже изменить на "\-"

в общем как-то так....
...
Рейтинг: 0 / 0
30.07.2009, 20:00
    #36118988
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
SevolodА в чем именно ошибка в шаблоне? Ведь в шаблоне нет ни одной точки с запятой. Почему VBScript считает валидной строку e-mail, разделенную именно этими разделителями.Да пофиг ему какие там разделители в строке. Нету у регулярных выражений понятия "разделители", там только "символы" :)

SevolodЗадача - сказать все ли e-mailы валидны в строке.Тогда тебе нужно во первых разрезать строку по разделителям, а потом проверить каждый из полученных кусочков на соответствие правилам формирования адреса.
Можно сделать например так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
str_in = "A/a@rbc.ru; B@rbc.ru;чушь-всякая"
arr = split(str_in, ";")

set re = new RegExp
re.Pattern = "^\s*[a-zA-Z._-]+@[a-zA-Z._-]+\s*$"
for i= 0  to ubound(arr)
   wscript.echo arr(i)
   if re.test(arr(i)) then
      wscript.echo "passed"
   else
      wscript.echo "failed"
   end if
next


Krasnaja Shapkaнадо пихать в первых квадратных скобках вместо "." - "\." ну и попутно третью черту "-" надо тоже изменить на "\-"Не надо :) У квадратных скобок собственные правила обработки шаблонных символов.
...
Рейтинг: 0 / 0
30.07.2009, 21:51
    #36119094
Sevolod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
Ну. На самом деле я вызываю VBScript через CreateOleObject. Но, судя по MSDN, это не принципиально.

Krasnaja Shapka ,
для моей маски опытным путем я установил, что

Код: plaintext
RegExp.Test("A@rbc.ru;B@rbc.ru") 
возвращает True,
а
Код: plaintext
RegExp.Test("A@rbc.ru; B@rbc.ru") 
- False .

Повторюсь, я не понимаю, почему результат таков.

White Owl ,

Да. Согласен. Это вариант решения. Можно распарсить строку (хотя по-моему несколько забавно читать про мощь регулярных выражений и перед их использованием делать парсинг). В крайнем случае я им воспользуюсь.

Но почему же
Код: plaintext
RegExp.Test("A@rbc.ru;B@rbc.ru")
возвращает True? Может, понятие "разделителей" все-таки где-то неявно используется? Или у меня какие-то странности именно из-за вызова из внешнего приложения, а если весь пример создать в VBA, то RegExp.Test для обеих моих строк вернет False ?
...
Рейтинг: 0 / 0
30.07.2009, 23:41
    #36119168
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
Sevolod
Код: plaintext
RegExp.Test("A@rbc.ru;B@rbc.ru") 
возвращает True,
а
Код: plaintext
RegExp.Test("A@rbc.ru; B@rbc.ru") 
- False .
Повторюсь, я не понимаю, почему результат таков. Потому что у тебя имя юзера проверяется через "[a-zA-Z0-9.-_]" Здесь определены три диапазона "a-z", "A-Z" и ".-_" последнее это тоже диапазон. В который, по странной случайности (смотри ASCII таблицу), входит оооочень многое.
Вот смотри пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function RegExpTest(patrn, strng)
   Dim regEx, Match, Matches   ' Create variable.
   Set regEx = New RegExp   ' Create a regular expression.
   regEx.Pattern = patrn   ' Set pattern.
   regEx.IgnoreCase = True   ' Set case insensitivity.
   regEx.Global = True   ' Set global applicability.
   Set Matches = regEx.Execute(strng)   ' Execute search.
   For Each Match in Matches   ' Iterate Matches collection.
      RetStr = RetStr & "Match found at position "
      RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
      RetStr = RetStr & Match.Value & "'." & vbCRLF
   Next
   RegExpTest = RetStr
End Function

wscript.echo "first:"
wscript.echo RegExpTest("[a-zA-Z0-9.-_]+", "A/a@rbc.ru; B@rbc.ru")
wscript.echo "second:"
wscript.echo RegExpTest("[a-zA-Z0-9._-]+", "A/a@rbc.ru; B@rbc.ru")
Сравни результаты этих двух шаблонов. А потом почитай об обработке положения минуса в квадратных скобках.

SevolodДа. Согласен. Это вариант решения. Можно распарсить строку (хотя по-моему несколько забавно читать про мощь регулярных выраженийНу во первых, не распарсить а разрезать. А во вторых, мощь мощи рознь.
И вообще, не забывай старую-старую шутку: " Some people, when confronted with a problem, think “I know, I'll use regular expressions.” Now they have two problems. "
...
Рейтинг: 0 / 0
31.07.2009, 10:02
    #36119507
Sevolod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
White Owl,

Спасибо большое! Чего-то я ошибался про ASCII-код минуса ((. Главное, что стало понятно, почему все работает именно так. Остальное - дело техники.
...
Рейтинг: 0 / 0
31.07.2009, 15:54
    #36120830
Krasnaja Shapka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
White OwlKrasnaja Shapkaнадо пихать в первых квадратных скобках вместо "." - "\." ну и попутно третью черту "-" надо тоже изменить на "\-"Не надо :) У квадратных скобок собственные правила обработки шаблонных символов.
гм... не знал... но всетаки, если записать "\-" вместо "-", то ".-_" перестает быть диаппазоном :) и все ок :)
...
Рейтинг: 0 / 0
02.08.2009, 19:09
    #36122176
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
А если подумать, то в принципе можно и одними шаблонами решить задачу:
Код: plaintext
re.Pattern = "^(\s*[a-z0-9._-]+@[a-z0-9._-]+\s*;)*\s*[a-z0-9._-]+@[a-z0-9._-]+\s*$"
...
Рейтинг: 0 / 0
03.08.2009, 11:59
    #36122907
Krasnaja Shapka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
прикольно получилось

вот только я бы добавил чтоб в имене домена было имя + буквенное расширение... иначе "1@4" или "baba@masha.111" или "baba@masha..."- тоже эмейлы, хотя это и не так

но тем неменее ваш шаблон лучший из представленного :)
...
Рейтинг: 0 / 0
03.08.2009, 16:37
    #36123672
Krasnaja Shapka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
кстати подчеркивание в имени домена тоже не допускается...
финальная версия у меня получилась такая:
Код: plaintext
1.
^(\s*[a-z0- 9 ._\-]+@(([a-z0- 9 \-]+\.)+)([a-z]+)\s*;)*\s*[a-z0- 9 ._\-]+@(([a-z0- 9 \-]+\.)+)([a-z]+)\s*$
...
Рейтинг: 0 / 0
10.08.2009, 09:41
    #36134326
komandin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
Тут есть примеры

http://komandin.org/regex/regex_view.html
...
Рейтинг: 0 / 0
07.12.2009, 18:32
    #36352696
Andreas_84
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RegExp. Проверка нескольких e-mail в одной строке
SevolodВсем добрый день!
Вопрос по регулярным выражениям . Есть строка, которая содержит несколько e-mail. Почему, когда они разделены символом ";" и строка не содержит пробелов, то метод Test возвращает True ( маска ^[a-zA-Z0-9.-_]+@[a-zA-Z0-9.-]+\.\w\w+$ )? А если разделитель не ";" или в строке есть пробелы, то метод Test возвращает False.

То есть для строки "A@rbc.ru;B@rbc.ru" вернется True, а для строки "A@rbc.ru; B@rbc.ru" - false. Код примерно такой.

Код: plaintext
1.
2.
3.
     
     RegExp.Global = True
     RegExp.Pattern = "^[a-zA-Z0-9.-_]+@[a-zA-Z0-9.-]+\.\w\w+$"
     RegExp.Test(sStr) 
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / RegExp. Проверка нескольких e-mail в одной строке / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]