我正在阅读Peter Cooper的书“Beginning Ruby”,我对一些字符串方法和正则表达式用法有一些疑问。我想我清楚正则表达式是什么:“一个描述其他字符串中匹配元素的模式的字符串。”
所以:
"This is a test".scan(/\w\w/) {|x| puts x}
Output:
Th
is
is
te
st
=> "This is a test"
另外,
"This is a test".scan(/[aeiou]/) { |x| puts x }
字符类说明:
“在这个阶段你需要理解的正则表达式的最后一个重要方面是 人物类。这些允许您匹配特定的字符集。例如,您可以扫描字符串中的所有元音:“
答案 0 :(得分:1)
是的,它被称为character class。
字符类定义一组字符。说,"匹配类"指定的一个字符。字符类的两个实现被认为是正类[ ]
和负类[^ ]
。正字符类允许您定义字符列表,其中任何一个字符可能出现在字符串中以便匹配发生,而否定类允许您定义必须 NOT 出现的字符列表用于匹配的字符串。
您的角色类说明:
[aeiou] # any character of: 'a', 'e', 'i', 'o', 'u'
答案 1 :(得分:1)
scan方法通常会返回一个带匹配项的数组,但它可以选择接受一个块,这相当于生成数组的each
。
以下是文档:http://www.ruby-doc.org/core-2.1.3/String.html#method-i-scan
对于第二个问题,@ hwnd已经给你一个明确的答案。了解这一点的最佳方法是进行实验,regex101.com是我经常使用的在线工具。它列出了所有匹配元素的解释,因此它也是一个很好的学习资源。
您可能想尝试的一些事情:
123abab12ab1234
[123]
带有模式123abab12ab1234
[ab]+
带有模式123abab12ab1234
b[1|a]
答案 2 :(得分:1)
要记住的一件事是字符类匹配一个字符,例如:
str = 'XXXaeiouXXX'
puts str
str.sub!(/[aeiou]/, '.')
puts str
--output:--
XXXaeiouXXX
XXX.eiouXXX
一个角色类说:“匹配此角色或此角色或此角色......一次性”。
另请查看rubular:
我没有意识到它也会返回原始字符串。这是为什么?
这样你就可以把方法连在一起了:
my_str.scan(...).downcase.capitalize.each_char {|char| puts char}.upcase.chomp