Вивчаю регулярні вислови. Процедура перевірки правильності запису електронної адреси є без сумніву необхідна.
В код програми я включив паттерн, який пропонує бібліотека MSDN:
Пропозиція Microsoft на перший погляд універсальна. Шаблон аналізує не лише ім`я домена, але і IP-адреси на зразок j_9@[129.126.118.1]. Але виявилося, що паттерн вважає неправильними адреси поштового сервісу www.i.ua (my-email@i.ua). Очевидно, назва домену із однієї літери є нестандартною. Але ж сервіс існує?
Проблемною можна вважати передостанню частину паттерну: "...([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+...". Спочатку відбувається пошук одного символа із діапазону "[0-9a-zA-Z]" (тобто від "0" до "9", або від "a" до "z", або від "A" до "Z"). Наступними можуть бути-не-бути дефіси або символи з діапазону "[0-9a-zA-Z]" (частина "[-\w]*"). Завершує будь який символ із "[0-9a-zA-Z]". Пошуковий текст повинен закінчитися крапкою.
Дивно, але за таким паттерном правильними вважаються адреси вигляду myemail@server-----x.com.
Передостанню частину я переписав як "...([0-9a-zA-Z]+[-]?[0-9a-zA-Z]*\.)+...". Пропоную один або декілька символів "[0-9a-zA-Z]+", потім відсутність або один дефіс "[-]?", за яким слідує відсутність або декілька символів "[0-9a-zA-Z]*". Шаблон завершується крапкою "\.". Весь вираз повторюється один або декілька разів - для цього є знак "+" в кінці рядка.
Загальний вигляд удосконаленого мною патерну перевірки правильності електронної пошти:
Отже, не порушуючи особливо логіки базового шаблону, поштові адреси із сервісу www.i.ua вважаються правильними, домени із n-ою кількістю дефісів - неправильними.
З повагою, Юрій Оснадчук.
Література:
В код програми я включив паттерн, який пропонує бібліотека MSDN:
string _pattern = "^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$"
Пропозиція Microsoft на перший погляд універсальна. Шаблон аналізує не лише ім`я домена, але і IP-адреси на зразок j_9@[129.126.118.1]. Але виявилося, що паттерн вважає неправильними адреси поштового сервісу www.i.ua (my-email@i.ua). Очевидно, назва домену із однієї літери є нестандартною. Але ж сервіс існує?
Проблемною можна вважати передостанню частину паттерну: "...([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+...". Спочатку відбувається пошук одного символа із діапазону "[0-9a-zA-Z]" (тобто від "0" до "9", або від "a" до "z", або від "A" до "Z"). Наступними можуть бути-не-бути дефіси або символи з діапазону "[0-9a-zA-Z]" (частина "[-\w]*"). Завершує будь який символ із "[0-9a-zA-Z]". Пошуковий текст повинен закінчитися крапкою.
Дивно, але за таким паттерном правильними вважаються адреси вигляду myemail@server-----x.com.
Передостанню частину я переписав як "...([0-9a-zA-Z]+[-]?[0-9a-zA-Z]*\.)+...". Пропоную один або декілька символів "[0-9a-zA-Z]+", потім відсутність або один дефіс "[-]?", за яким слідує відсутність або декілька символів "[0-9a-zA-Z]*". Шаблон завершується крапкою "\.". Весь вираз повторюється один або декілька разів - для цього є знак "+" в кінці рядка.
Загальний вигляд удосконаленого мною патерну перевірки правильності електронної пошти:
string _pattern = @"^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z]+[-]?[0-9a-zA-Z]*\.)+[a-zA-Z]{2,6}))$";
Отже, не порушуючи особливо логіки базового шаблону, поштові адреси із сервісу www.i.ua вважаються правильними, домени із n-ою кількістю дефісів - неправильними.
З повагою, Юрій Оснадчук.
Література:
Немає коментарів:
Дописати коментар