2015-11-16 4 views
0

Я хочу проверить подлинность электронной почты с помощью clojure. Как мне это сделать.как проверить подлинность электронной почты в clojure

(defn validate-email [email] 

    ) 

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

+1

Посмотрите на [Использование регулярного выражения для проверки адреса электронной почты] (http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address) –

+0

Я новичок в clojure. Я не могу написать правильный синтаксис для проверки по электронной почте. –

+1

Даунвиты абсолютно глупы. Это вопрос начинающих, и у него больше просмотров, чем другие недавние вопросы #clojure. –

ответ

2
(defn validate-email 
    [email] 
    (let [pattern #"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"] 
    (and (string? email) (re-matches pattern email)))) 

Насколько регулярные выражения в Clojure, это может помочь: http://www.lispcast.com/clojure-regex

+0

're-matches' всегда ищет полные совпадения, поэтому нет необходимости добавлять с ним'^'или' $'. –

+0

Хорошая точка, спасибо. Также обновлена ​​до более надежной версии. –

+0

Получил свободу редактировать свой код. –

2

Вот пример простой функции, которая будет проверять ввод email строку против простого регулярного выражения:

(defn validate-email [email] 
    (re-matches #".+\@.+\..+" email)) 

Он вернется вход email, если он соответствует .+\@.+\..+ регулярному_выражению и nil иначе:

(validate-email "[email protected]") ;=> "[email protected]" 
(validate-email "invalid") ;=> nil 
(if (validate-email "[email protected]") :valid :invalid) ;=> :valid 
(if (validate-email "invalid") :valid :invalid) ;=> :invalid 

И если вам нужно хорошее regexp для соответствия сообщениям электронной почты, см. Using a regular expression to validate an email address.

1

Обратите внимание, что с помощью регулярного выражения для определения «хороших» или законные адреса электронной почты, как известно, трудно получить право. Существует ряд краевых случаев, которые легко упускать из виду. Это стало намного легче, так как некоторые из более загадочных маршрутов маршрутизации почты оказались неиспользованными, но это может быть сложно.

Моим советом было бы использовать что-то вроде bouncer, которое является библиотекой проверки подлинности, которая может использоваться как на стороне клиента, так и на стороне сервера, то есть для clojure или clojurescript. Он имеет встроенную поддержку проверки подлинности электронной почты. Существует множество других библиотек, которые делают подобное.

Это приведет вас в рабочее состояние. Вы также можете посмотреть исходный код, чтобы узнать, как эта проблема может быть решена. Позже, как только у вас будет больше опыта, вы можете попробовать сделать что-то подобное (но лучше :-) самостоятельно

0

Существует много дискуссий о SO и других местах, где можно сопоставить адреса электронной почты с регулярными выражениями. Мне кажется, что вы спрашиваете, как использовать регулярные выражения в Clojure.

Читатель распознает #" как начало буквального регулярного выражения, заканчивающееся на ". Пример: #"(t)+".

Вы также можете использовать re-pattern для компиляции регулярного выражения из строки, чтобы вы могли динамически создавать шаблон регулярного выражения, например: (re-pattern (str "^" my-var "$")).


Если вы пытаетесь использовать регулярное выражение, чтобы соответствовать строке во всей ее полноте, вы можете использовать re-matches. Она возвращает nil (нет соответствия) исходная строка (она соответствует), или вектор [full-string, capture-1, capture-2, ...]

(re-matches #"abc" "abcdefg") ;; => nil 
(re-matches #"abc.*" "abcdefg") ;; => "abcdefg" 
(re-matches #"abc(.)(.*)" "abcdefg") ;; => ["abcdefg", "d", "efg"] 

re-matcher принимает регулярное выражение и строку и возвращает java.util.regex.Matcher. Вы можете использовать метод find(), чтобы получить следующий матч, или вы можете использовать Clojure's re-find.

(def my-matcher (re-matcher #"[aeiou].[aeiou]" "alienate")) 
(re-find my-matcher) ;; => "ali" 
(re-find my-matcher) ;; => "ena" 
(re-find my-matcher) ;; => nil 

Если вы используете Искателя, то вы можете использовать re-groups, чтобы получить группы с самого последнего матча.


Другое использование re-find является регулярным выражением и строкой, чтобы вернуть только первый матч:

(re-find #"[aeiou].[aeiou]" "alienate") ;; => "ali" 

Для многих случаев, вы найдете re-seq быть более удобной альтернативой до re-find с re-matcher. Она возвращает ленивой последовательности всех матчей:

(re-seq #"[aeiou].[aeiou]" "alienate") ;; => ("ali", "ena"), lazily 

Наконец, вы можете производить поиск и замену с replace и replace-first. re-quote-replacement помогает с раздражающим действием экранирующих символов.

0

Clojure имеет очень полезную библиотеку проверки, т.е. valip библиотеки
Если вы посмотрите в файл predicates.clj, вы можете увидеть, что есть email-address? и valid-email-domain? функции и те именно для porpuse. Таким образом, вы можете использовать его следующим образом

(defn validate-email [email] (valid-email-domain? email))

Вы можете использовать valid-email-domain как для Clojure и email-address для обоих clojure и clojurescript.
Здесь находится ссылка:
https://github.com/weavejester/valip/blob/master/src/valip/predicates.clj
с другими полезными функциями валидации.

Смежные вопросы