Ruby Koans - Regex和.sub:不理解答案背后的原因

Dav*_*son 8 ruby regex

为了澄清,这里about_regular_expressions.rb是我遇到问题的文件中的确切问题:

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

我知道答案是什么,但我不明白为了得到答案会发生什么.我对Ruby和regex都很陌生,特别是我对大括号之间的代码以及它是如何发挥作用感到困惑.

mu *_*ort 11

大括号内的代码是sub用于替换匹配的块:

在块形式中[...]块返回的值将替换每次调用的匹配.

块接收所述匹配作为参数,但通常的正则表达式的变量($1,$2,...)也可提供.

在这种特定情况下,$1块内部"two"数组符号提取第一个字符$1("t"在这种情况下).因此,块返回"t"并用just sub替换"two"原始字符串中的"t".

  • @Dave:`sub`只做一个匹配(不像`gsub`捕获所有匹配).正则表达式匹配一个"t"后跟零个或多个(`*`)单词字符(`\ w`,字母数字加上"_"),括号将匹配放在第一组(`$ 1`).结果是正则表达式找到"两个"并且最终在块内的"$ 1"中. (5认同)