2012-04-24 86 views
6

的紅寶石(1.9.3)文檔似乎暗示掃描相當於=〜除了紅寶石正則表達式與掃描=〜

  1. 掃描返回多個匹配,而=〜只返回的第一次出現,並
  2. 掃描返回匹配數據,而=〜返回索引。

但是,在下面的示例中,這兩個方法似乎對同一個字符串和表達式返回不同的結果。這是爲什麼?

1.9.3p0 :002 > str = "Perl and Python - the two languages" 
=> "Perl and Python - the two languages" 
1.9.3p0 :008 > exp = /P(erl|ython)/ 
=> /P(erl|ython)/ 
1.9.3p0 :009 > str =~ exp 
=> 0 
1.9.3p0 :010 > str.scan exp 
=> [["erl"], ["ython"]] 

如果第一場比賽的指數是0,不應掃描回報「的Perl」和而不是「ERL」和「蟒蛇」「巨蟒」?

由於

回答

12

當給定一個正則表達式,而不捕獲組,scan將返回字符串,其中,每個串代表一個匹配正則表達式的陣列。如果你使用scan(/P(?:erl|ython)/)(這與你的正則表達式相同,除非沒有捕獲組),你會得到["Perl", "Python"],這是你的期望。

然而,當給定一個帶有捕獲組的正則表達式時,scan將返回一個數組數組,其中每個子數組包含給定匹配的捕獲。所以,如果你有例如正則表達式(\w*):(\w*),你會得到一個數組數組,其中每個子數組包含兩個字符串:冒號前的部分和冒號後的部分。在你的例子中,每個子數組都包含一個字符串:(erl|ython)匹配的部分。

+0

謝謝,所以掃描是嚴格不等於=〜,當有涉及組? – Anand 2012-04-24 03:46:38

+2

@Anand由於掃描返回的東西完全不同於〜,我不認爲它們是相等的。掃描返回的第一個結果是一個從索引'str =〜exp'開始的子字符串,當且僅當'exp'不包含捕獲組時。除此之外,你還可以說第一個結果將等於'Regexp.last_match.string'在執行'str =〜exp'後獲得,如果它不包含捕獲組,則返回'Regexp.last_match.captures'確實包含捕獲組。 – sepp2k 2012-04-24 03:58:56

+0

很高興看到您可以從中學習的這類文章。 – texasbruce 2012-04-24 04:15:23