Regex 向代码块传递字符串(包括正则表达式参数)

Regex 向代码块传递字符串(包括正则表达式参数),regex,ruby,string,gsub,Regex,Ruby,String,Gsub,长度大于等于4个字母的字符串需要按以下格式返回: “#{firstLetter}#{string.length-2}#{lastLetter}” InputString=stackoverflow ExpectedString=s11w 下面是产生正确预期输出的代码 string.gsub /(\w)(\w+{2})(\w)/ do |word| "#{$1}#{word.length-2}#{$3}" end 我有点了解这里发生的事情,但不理解正则表

长度大于等于4个字母的字符串需要按以下格式返回:

“#{firstLetter}#{string.length-2}#{lastLetter}”

InputString=stackoverflow

ExpectedString=s11w

下面是产生正确预期输出的代码

string.gsub /(\w)(\w+{2})(\w)/ do |word|       
      "#{$1}#{word.length-2}#{$3}"        
end

我有点了解这里发生的事情,但不理解正则表达式与$1和$3的使用之间的确切关系。有点明白了。。。但是还不足以以我自己的方式使用它来解决新问题。

在正则表达式中,您有3个捕获组:
\w
\w+{2}
\w
。当您稍后说
$N
(其中
N
是一些数字)时,实际上是指正则表达式中的捕获组


String#gsub
方法为您填充这些变量()。

非常简单:
$N
表示“匹配中第N个捕获组的内容”。顺便说一句,这个正则表达式很奇怪。为什么
\w+{2}
?它是有效的,但是。。。韦尔德。根据引擎的实现方式,可能会导致效率低下。我会写
\w{2,}
…在文档中遗漏了它。感谢您对我的愚蠢问题的帮助。因此.gsub根据正则表达式的要求在字符串中查找匹配条件,并用字符串文本中指定的条件替换每个匹配项。正确吗?@Rey在块形式中,
gsub
用块的结果替换每个匹配项。@Rey是的,但不是每个匹配项,而是每个捕获组。以下正则表达式不起作用:
/\w\w+{2}\w/