Ruby正则表达式问题与String上的sub方法有关

jay*_*del 5 ruby regex

我正在阅读Koans教程(这是一个很好的学习方法),我遇到了这样的说法:

assert_equal __, "one two-three".sub(/(t\w*)/) { $1[0, 1] }
Run Code Online (Sandbox Code Playgroud)

在这个语句中,__是我应该放置我的预期结果以使测试正确执行的地方.我已经盯着它看了一段时间并将其中的大部分分开,但我无法弄清楚最后一点意味着什么:

{ $1[0, 1] }
Run Code Online (Sandbox Code Playgroud)

预期的答案是:

"one t-three"
Run Code Online (Sandbox Code Playgroud)

我期待着:

"t-t"
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 11

{ $1[0, 1] }是包含表达式的块$1[0,1].$1[0,1]计算字符串的第一个字符$1,其中包含最后一个匹配的正则表达式的第一个捕获组的内容.

sub使用正则表达式和块调用时,它将找到正则表达式的第一个匹配项,调用块,然后将匹配的子字符串替换为块的结果.

所以"one two-three".sub(/(t\w*)/) { $1[0, 1] }搜索模式t\w*.这会找到子字符串"two".由于整个事物都在捕获组中,因此该子字符串存储在其中$1.现在调用块并返回"two"[0,1],即"t".所以"two"被替换为"t",你得到"one t-three".

需要注意的一点是sub,不同的是gsub,只替换第一次出现,而不是出现模式.