Как определить, есть ли совпадение, возвращающее true или false в рельсах? - PullRequest
19 голосов
/ 09 сентября 2011

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

На данный момент, если адрес электронной почты начинается с r +, тогда это правда, иначе это ложь. Это поможет нашему серверу игнорировать большую часть СПАМА, в который мы попали.

Примеры:

r+kldslkadslkadslk@site.com .. true
r+123123312@site.com .. true
vigraaaa@site.com .. FALSE

Какой самый эффективный способ справиться с этим с помощью Rails / ruby ​​/ regex?

Спасибо

ЗАДАЧА

Является ли один вкладыш в рельсы / рубин с:

ABORT if XXXXX == 0

Ответы [ 4 ]

34 голосов
/ 09 сентября 2011

Это будет соответствовать:

/^r\+.*@site.com$/

Примеры:

>> 'r+kldslkadslkadslk@site.com' =~ /^r\+.*@site.com$/ #=> 0
>> 'vigraaaa@site.com' =~ /^r\+.*@site.com$/ #=> nil

Поскольку в Ruby все, что не nil или false, является правдой, вы можете использовать это регулярное выражение в условии. Если вы действительно хотите логическое значение, вы можете использовать идиому !!:

>> !!('vigraaaa@site.com' =~ /^r\+.*@site.com$/) #=> false
>> !!('r+kldslkadslkadslk@site.com' =~ /^r\+.*@site.com$/) #=> true
10 голосов
/ 09 сентября 2011

Если вы в Rails, есть старты с?метод для строк:

"foo".starts_with?('f') # => true
"foo".starts_with?('g') # => false

За пределами Rails регулярные выражения являются разумным решением:

"foo" =~ /^f/ # => true
"foo" =~ /^g/ # => false

Поскольку Ruby использует правдивость в операторах if, если вы в конечном итоге используете регулярные выражения, вы можетепросто используйте возвращаемое значение для переключения:

if "foo" =~ /^f/
  puts "Was true!"
else
  puts "Was false!"
end

Если вы пишете метод и хотите вернуть логический результат, вы всегда можете использовать трюк двойного взрыва:

def valid_email?
  !!("foo" =~ /^f/)
end

Rubular (rubular.com) - хороший сайт для тестирования регулярных выражений Ruby до 1.9.(Регулярные выражения 1.9 добавили такие вещи, как lookahead.)

8 голосов
/ 08 декабря 2014

Если вы не хотите использовать «!!»оператор:

!!("foo" =~ /^f/)

Вы можете использовать троичный оператор (может показаться более очевидным):

"foo" =~ /^f/ ? true : false
7 голосов
/ 21 января 2017

Вы также можете использовать оператор '==='

/f/ === 'foo' #=> true

/f/ === 'bat' #=> false

Примечание: часть регулярного выражения находится слева:

/ YOUR_REGEX / === 'YOUR_STRING'

...