2014-10-03 97 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