Ruby正则表达式和括号。括号做什么?

时间:2014-10-03 20:57:29

标签: ruby regex

我正在阅读Peter Cooper的书“Beginning Ruby”,我对一些字符串方法和正则表达式用法有一些疑问。我想我清楚正则表达式是什么:“一个描述其他字符串中匹配元素的模式的字符串。”

所以:

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

Output:
Th
is
is
te
st
=> "This is a test"
  1. 所以它一次打印两个字符。我没有意识到它也返回原始字符串。这是为什么?
  2. 另外,

        "This is a test".scan(/[aeiou]/) { |x| puts x }
    
    1. 括号有什么作用?我认为它们被称为角色类,但我不确定它们究竟是做什么的。 Cooper的书中的解释并不完全清楚。
    2. 字符类说明:

        

      “在这个阶段你需要理解的正则表达式的最后一个重要方面是   人物类。这些允许您匹配特定的字符集。例如,您可以扫描字符串中的所有元音:“

3 个答案:

答案 0 :(得分:1)

是的,它被称为character class

字符类定义一组字符。说,"匹配类"指定的一个字符。字符类的两个实现被认为是正类[ ]和负类[^ ]。正字符类允许您定义字符列表,其中任何一个字符可能出现在字符串中以便匹配发生,而否定类允许您定义必须 NOT 出现的字符列表用于匹配的字符串。

您的角色类说明:

[aeiou]    # any character of: 'a', 'e', 'i', 'o', 'u'

答案 1 :(得分:1)

  1. scan方法通常会返回一个带匹配项的数组,但它可以选择接受一个块,这相当于生成数组的each

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

  2. 对于第二个问题,@ hwnd已经给你一个明确的答案。了解这一点的最佳方法是进行实验,regex101.com是我经常使用的在线工具。它列出了所有匹配元素的解释,因此它也是一个很好的学习资源。

    您可能想尝试的一些事情:

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

答案 2 :(得分:1)

要记住的一件事是字符类匹配一个字符,例如:

str = 'XXXaeiouXXX'
puts str
str.sub!(/[aeiou]/, '.')
puts str

--output:--
XXXaeiouXXX
XXX.eiouXXX

一个角色类说:“匹配此角色或此角色或此角色......一次性”。

另请查看rubular:

http://rubular.com/

  

我没有意识到它也会返回原始字符串。这是为什么?

这样你就可以把方法连在一起了:

my_str.scan(...).downcase.capitalize.each_char {|char| puts char}.upcase.chomp
相关问题