2016-11-02 3 views
2

Я давал это регулярное выражение /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]{2,}\z/, и я должен использовать его для проверки действительности адреса электронной почты.Метод совпадения Ruby Regex

Это мой первый код Ruby, и я не уверен, как это сделать. Мне сказали использовать метод .match, который возвращает объект MatchData. Но как я могу проверить, что объект MatchData подтверждает достоверность?

Я попытался использовать следующее, но кажется, что он принимает любую строку, даже не адрес электронной почты.

#Register new handler 
def register_handler 

    email_regex = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]{2,}\z/ 
    email = "invalid" 
    unless email =~ email_regex then 
     puts("Insert your e-mail address:") 
     email = gets 
    end 

    puts("email received") 


end 

Каков правильный способ сделать это? Либо используйте .match, либо метод, который я попытался сделать выше.

ответ

3

Регулярное выражение соответствует адреса электронной почты:

'invalid' =~ email_regex 
=> nil # which boolean value is false 

'[email protected]' =~ email_regex 
=> 0 # which boolean value is true 

однако:

"[email protected]\n" =~ email_regex 
=> nil 

Символ новой строки \n прилагается к каждому входу gets.

Именно поэтому цикл until будет работать вечно независимо от того, что вы наберете в терминале. Результат совпадения всегда будет nil из-за символа новой строки.

Попробуйте использовать gets.chomp, который будет обрезать символ новой строки и ваш код должен работать.

1

Попробуйте это:

Под редакцией регулярное выражение и положить(), чтобы захватить группу и начало и конец

re = /^([\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]{2,})$/m 
str = '[email protected] 
[email protected] 
[email protected] 
.... 
[email protected] 


aasdf.com 

www.yahoo.com' 

# Print the match result 
str.scan(re) do |match| 
    puts match.to_s 
end 

Running sample code

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