2014-10-03 140 views
0

我正在閱讀Peter Cooper的書「Beginning Ruby」,我對一些字符串方法和正則表達式的使用有一些疑問。我想我很清楚正則表達式是什麼:「描述匹配其他字符串中元素的模式的字符串」。Ruby正則表達式和括號。括號做什麼?

所以:

"This is a test".scan(/\w\w/) {|x| puts x} 

Output: 
Th 
is 
is 
te 
st 
=> "This is a test" 
  1. 所以在一次打印兩個字符。我沒有意識到它也會返回原始字符串。爲什麼是這樣?

此外,

"This is a test".scan(/[aeiou]/) { |x| puts x } 
  • 什麼括號做什麼?我認爲他們被稱爲人物類,但我不確定他們做了什麼。 Cooper書中的解釋並不完全冗長和清晰。
  • 字符類的說明:

    「你需要在這個階段,瞭解正則表達式的最後一個重要的方面是 字符類這允許你來匹配特定的字符集爲。例如,您可以掃描字符串中的所有元音:「

    +1

    字符類匹配單個字符,如果字符類包含的字符。例如。 '[aeiou]'將匹配'a','e','i','o'或者'u'中的任何一個。所以第二個命令的輸出應該是「我」,「我」,「一個」,「e」。 – 2014-10-03 21:12:22

    +2

    http://ruby-doc.org/core-2.1.3/Regexp.html – 2014-10-03 21:13:11

    +2

    你會想看看這個:http://rubular.com/在快速參考部分甚至有字符類的例子。 – orde 2014-10-03 21:53:31

    回答

    1

    是的,它被稱爲character class

    一個字符類定義了一組字符。說,「匹配一個字符指定的類」。字符類的兩個實現被認爲是正類[ ]和負類[^ ]。正字符類允許您定義一個字符列表,其中的任何一個可能出現在一個字符串中以便匹配發生,而否定類允許您定義一個字符列表,這些字符必須在字符串中出現時纔會出現在NOT之間匹配發生。

    您的字符類的說明:

    [aeiou] # any character of: 'a', 'e', 'i', 'o', 'u' 
    
    1
    1. 掃描方法通常返回與所述匹配的陣列,但它選擇性地接受一個塊,這相當於做所得陣列的each

      下面是文檔:http://www.ruby-doc.org/core-2.1.3/String.html#method-i-scan

    2. 對第二個問題,@hwnd已經給你一個明確的答案。學習這個最好的方法是試驗,regex101.com是我通常使用的在線工具。它列出了所有匹配元素的解釋,所以它也是一個很好的學習資源。

      你可能想有些事情嘗試:

      1. 123abab12ab1234與模式[123]
      2. 123abab12ab1234與模式[ab]+
      3. 123abab12ab1234與模式b[1|a]
    1

    有一點要記住的是Ť帽子一個字符類匹配一個字符,例如:

    str = 'XXXaeiouXXX' 
    puts str 
    str.sub!(/[aeiou]/, '.') 
    puts str 
    
    --output:-- 
    XXXaeiouXXX 
    XXX.eiouXXX 
    

    字符類說,「這個匹配字符或該字符或該字符... ONE TIME」。

    還檢查了rubular:

    http://rubular.com/

    我沒有意識到它也返回原來的字符串。爲什麼是這樣?

    ,這樣就可以鏈方法一起使用:

    my_str.scan(...).downcase.capitalize.each_char {|char| puts char}.upcase.chomp