这个Ruby / RegEx代码有什么作用?

时间:2011-07-13 04:48:39

标签: ruby regex

我正在通过初学Ruby从新手到专业第2版,目前在第49页,我们正在学习RegEx基础知识。书中的每个RegEx代码段都有一个跟踪它的代码,但尚未解释。

{ |x| puts x }

在上下文中:

"This is a test".scan(/[a-m]/) { |x| puts x }

有人可以告诉我吗?

5 个答案:

答案 0 :(得分:2)

scan之类的方法是迭代器;在这种情况下,每次匹配传递的正则表达式时,scan执行程序员指定的操作。在Ruby中,“something”表示为,由{ code }do code end(具有不同的优先级)表示,它作为特殊参数传递给方法。块可以以参数列表(和局部变量)开始,这是|x|部分; scan使用匹配的字符串调用块,该字符串绑定到块内的x。 (此语法来自Smalltalk。)

因此,在这种情况下,scan每次/[a-m]/匹配时都会调用其阻止参数,这意味着am之间的字符串中的每个字符。< / p>

答案 1 :(得分:1)

它打印am之间字符串中的所有字母:http://ideone.com/lKaoI

|x| puts x是一个annonymouse函数,(或者是“ruby中的”块“,据我所知,或者是其他语言中的lambda),它打印出它的参数。
有关详细信息,请参阅:

答案 2 :(得分:1)

在您的图书示例的上下文中,它包含在每个表达式之后,因为它只是表示“打印出每个匹配项。

它是code block,它为正则表达式的每个匹配运行。

{ }创建代码块。

|x|为代码块

创建参数

puts打印出一个字符串,x是它打印的字符串。

正则表达式匹配字符类[a-m]中的任何单个字符。因此,有五种不同的匹配,并打印出来:

h
i
i
a
e

答案 3 :(得分:1)

输出

h
i
i
a
e

字符串“This is a test”的每个字符都是针对正则表达式[a-m]进行检查的,这意味着“a..m范围内只有一个字符,并且在其自己的行上打印(通过{ {1}})如果匹配。第一个字符puts不匹配,第二个T匹配,等等。最后一个字符是{{ 1}}在“测试”中。

答案 4 :(得分:0)

{ |x| puts x }定义了一个新块,它接受一个名为x的参数。调用块时,它会将其参数x传递给puts

编写相同内容的另一种方法是:

"This is a test".scan(/[a-m]/) do |x|
  puts x
end

每次正则表达式匹配字符串中的某些内容时,scan函数都会调用该块,因此每个匹配都会打印出来。

这里有关于块的更多信息: http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_containers.html