2012-04-04 13 views
2

私は個人的な電子メールアカウントをブロックするためにモデルの検証が必要です。拡張子に関係なくすべてのインターネットドメインに一致する正規表現を作る方法

私は次があります。

PERSONAL_DOMAINS = %w[ 
yahoo. 
ymail 
verizon 
] 

正規表現の検証:

:format => { 
    :without => /#{PERSONAL_DOMAINS.map{|a| Regexp.quote(a)}.join('|')}/ 
} 

理由ヤフーは、最後にドットがyahoo-inc.comを許可しますが、すべての個人のドメインをブロックすることでありyahoo.com、yahoo.fr、yahoo.ukなど...

この正規表現は失敗し、yahoo-inc.comが拒否されてしまいます...これを使用してユースケースを作成する方法上記のpa ss?

/(^|\.)(#{PERSONAL_DOMAINS.map{|a| Regexp.quote(a)}.join('|')})\.[^.]+$/i 

これは、第二の成分すべてのドメインと一致しますが、正確に次のいずれかです。

PERSONAL_DOMAINS_REGEXP = /#{PERSONAL_DOMAINS.map{|a| Regexp.quote(a)}.join('|')}/ 
=> /yahoo\.|ymail|verizon/ 

"yahoo-inc.com".match(PERSONAL_DOMAINS_REGEXP) 
=> nil 

"yahoo.com".match(PERSONAL_DOMAINS_REGEXP) 
=> #<MatchData "yahoo."> 
+1

再現できません。regexは "yahoo-inc.com"と一致しません。 –

答えて

2

は何が起こっているかを絞り込む支援するためのRailsせずに試合をやってみリスト。

ので、それが一致します。

yahoo.com 
Yahoo.fr 
sub.yahoo.id 

などではなく、

yahoo-inc.com 
notyahoo.com 
yahoo.other.com 

(変化 "ヤフー" バック "ヤフー" へ)

注意も "/ I"最後に。ドメインは大文字と小文字を区別しないので、これが必要になります。

0

は、次の正規表現を試してみてください:ありがとう

関連する問題