2010-02-15 82 views
3

我從string.scan和幾個正則表達式測試人員得到完全不同的reults ...非常奇怪的問題與Ruby和正則表達式

我只是想抓住從字符串域,這是硬道理。

有問題的正則表達式:

/([a-zA-Z0-9\-]*\.)*\w{1,4}$/ 

字符串(1個一行,在Ruby的運行BTW驗證)

str = 'Show more results from software.informer.com' 

做工精細,但在紅寶石....

irb(main):050:0> str.scan /([a-zA-Z0-9\-]*\.)*\w{1,4}$/ 
=> [["informer."]] 

我認爲我會得到software.informer.com比賽,這是我的目標。

+0

沒有答案,但看看http://rubular.com/,這是很好的測試正則表達式。 http://rubular.com/regexes/13669 – marcgg 2010-02-15 17:08:31

+0

謝謝..我認爲這是給我不一致的結果,但它只是我的string.scan – Zombies 2010-02-15 17:38:34

回答

2

,如果你希望不止一個結果(尤其是在正則表達式錨定)不看。在這種情況下,沒有理由使用掃描。

'Show more results from software.informer.com'[ /([a-zA-Z0-9\-]*\.)*\w{1,4}$/ ] 
#=> "software.informer.com" 

如果確實需要使用掃描(在這種情況下,你顯然需要刪除錨點),你可以使用(?:)創建非捕獲組。

'foo.bar.baz lala software.informer.com'.scan(/(?:[a-zA-Z0-9\-]*\.)*\w{1,4}/) 
#=> ["foo.bar.baz", "lala", "software.informer.com"] 
2

您在software.informer.com得到匹配。檢查$&的值。 scan的返回是一組捕獲的組。在後綴周圍添加圓括號,您也可以從scan獲得.com作爲返回值的一部分。

正則表達式測試和Ruby沒有不同意有關的根本問題(正則表達式本身)。相反,它們的界面在強調的方面有所不同。在irb中運行scan時,首先會看到的是返回值scan(捕獲的子模式的數組),與匹配的文本不同。正則表達式測試人員很可能面向顯示匹配的文本。

+0

嗯,我是新來的正則表達式:/ ...但我仍然不明白爲什麼正則表達式測試人員和紅寶石變化,即使是「紅寶石正則表達式測試儀「正在失敗我。嗯,我也想要1場比賽,而不是幾場比賽。這種方法讓我更多的比賽...? – Zombies 2010-02-15 16:56:13

3

你的正則表達式是正確的,結果有串#掃描行爲方式去做。從the official documentation

「如果圖案包含基團,每個獨立的結果是本身含有每組一個條目的陣列。」

基本上,如果你把周圍的整個正則表達式的括號,在搜索結果中每個數組的第一個元素將是你所期望的。

+0

有趣...但對我來說,圓括號似乎是不可避免的,但仍然影響掃描的方式。有小費嗎...? – Zombies 2010-02-15 17:00:26

+0

這裏的括號有點令人困惑,因爲它們有兩個截然不同的功能:分組重複的子表達式,並形成'scan'的輸出。我們可以通過引入另一個符號來控制掃描的輸出來解決這個問題,但我認爲括號通常工作得很好(通常最終會得到你想要的結果),並且在正則表達式中引入外部依賴(方法相關)符號不會似乎是一個好主意。 – 2010-02-15 17:10:03