2012-11-18 39 views
0

我有,檢測當一個字符串不是給定的模式正則表達式:正則表達式的紅寶石和運營商

/\A((?!.*(www|http|@|\.com\b|\.net\b|\.de\b|\.info\b)).*)$/m 

這意味着,像「嗨,你在www.test.com」字符串爲FALSE 但現在我想讓一個URL:www.example.com。

這意味着:

「這是一個測試」> TRUE

「這是一個測試www.example.com」> TRUE

「這是一個測試例子。 COM這個」> TRUE

「這是一個測試www.test.com這個」> FALSE

「這是一個測試test.com這個」> FALSE

「這是一個測試test.comwww.example.com」> FALSE(假的,因爲一個禁伐URL存在)

看來我需要包括一個與運營商,我認爲是:

(?=.*PATTERN) 

但不幸的是我不能使它工作。

ps:我知道這個檢測URL的正則表達式並不完美,但是因爲我的要求,它比沒有任何東西好。

謝謝!

編輯: 我的正則表達式是位於驗證:

def self.validates_is_url_and_email_free(*attr_name) 
    validates_format_of attr_name, {:with => /\A((?!.*(www|http|@|\.com\b|\.net\b|\.de\b|\.info\b)).*)$/m, :message => I18n.t(:not_url_email)} 
end 
+1

你在做什麼這場比賽?爲什麼不提取URI,然後對其進行二級操作? 'gsub'和'scan'可能會有所幫助。當你想要一個肯定的答案時,你使用否定斷言「?!」似乎很奇怪。 – tadman

+0

可能的重複[在rails 3中驗證鏈接(url)的好方法是什麼?](http://stackoverflow.com/questions/7167895/whats-a-good-way-to-validate-links-urls-in -rails-3) - 那裏有一些好的想法,也不涉及軌道。 –

回答

1

在這種情況下使用兩個獨立的表達可能是解決辦法:

OKAY_EXPR = /example\.com/ 
BANNED_EXPR = /.../ # Existing expression 

if (string.match(OKAY_EXPR) and !string.match(BANNED_EXPR)) 
    # ... 
end 

目前尚不清楚,你在這裏做什麼,但這似乎確實是一套極其嚴格的頂級域名(TLD)。字面上可能需要處理數千個valid TLDs

+0

我在編輯部分添加了更多詳細信息,我不知道如何將您的代碼放在我的:with,如果可能的話。 謝謝! – ratamaster

+0

這是一個Rails 2.x風格驗證。 Rails 3有一個新的語法:'validates ...,:format => {:with => /.../}'來做到這一點。無論如何,你總是可以編寫你自己的驗證程序,它可以做任何你想做的事情,避免寫一個非常複雜的正則表達式,一次完成所有事情。用一些棘手的預測負面斷言來表達它是可能的,但它最終會成爲幾乎不可讀的線路噪聲。 – tadman

+0

是的,我正在使用rails 2.你能告訴我一個例子,這個驗證程序有多白嗎? – ratamaster