我很难理解Ruby docs的以下代码段:
a = "hello world"
a.count "lo" #=> 5
a.count "lo", "o" #=> 2
a.count "hello", "^l" #=> 4
a.count "ej-m" #=> 4
"hello^world".count "\\^aeiou" #=> 4
"hello-world".count "a\\-eo" #=> 4
特别是此代码
a.count "ej-m"
。谁能解释一下它是如何工作的? 最佳答案
只需想象一下正则表达式语法中的[
和]
包装的“模式”字符串与每个字符都匹配。
因此,如果我们将a = "hello world"
分解为字符:
[1] pry(main)> a = "hello world"
=> "hello world"
[2] pry(main)> a.split('')
=> ["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d"]
并将“ej-m”转换为用
[
和]
包装的正则表达式,我们得到/[ej-m]/
-这意味着'e'
或从'j'
到'm'
的任何字符(包括两者):[3] pry(main)> a.split('').select{|c| c=~ /[ej-m]/}
=> ["e", "l", "l", "l"]
我们有4场比赛-这也是您得到的结果。从本质上讲
a.count "ej-m"
等效于:[4] pry(main)> a.split('').count{|c| c=~ /[ej-m]/}
=> 4
匹配之间的方法的多个参数只是
and
:[5] pry(main)> a.split('').count{|c| c =~ /[hello]/ and c =~ /[^l]/}
=> 4