Ruby正则表达式 – gsub存储匹配的内容吗?

如果我使用

.gsub(/matchthisregex/,"replace_with_this") 

gsub存储它与正则表达式匹配的地方吗? 我想在替换字符串中使用匹配的内容。 比如像

 "replace_with_" + matchedregexstring + "this" 

在上面的例子中,matchedregexstring将是来自gsub的存储匹配? 对不起,如果那令人困惑,我不知道怎么说。

从精细手册 :

如果replacement是一个String ,它将替换匹配的文本。 它可能包含对格式\d的模式捕获组的反向引用,其中d是组号,或者\k ,其中n是组名。 如果它是双引号字符串,则两个反向引用都必须以额外的反斜杠开头。 但是,在替换中 ,特殊匹配变量(例如&$ )不会引用当前匹配。
[…]
在块forms中,当前匹配字符串作为参数传入,并且将适当地设置诸如$1$2 ,$`, $&$'变量。 块返回的值将替换每次调用的匹配。

如果您不关心捕获组(即正则表达式中的(expr)类的东西(expr) ,那么您可以使用块forms和$&

 >> 'where is pancakes house?'.gsub(/is/) { "-#{$&}-" } => "where -is- pancakes house?" 

如果您有捕获组,则可以在替换字符串中使用\n

 >> 'where is pancakes house?'.gsub(/(is)/, '-\1-') => "where -is- pancakes house?" 

块中的$n$n

 >> 'where is pancakes house?'.gsub(/(is)/) { "-#{$1}-" } => "where -is- pancakes house?" 

对于所有ruby版本:获取匹配字符串的简单方法。

 .gsub(/matched_sym/) {|sym| "-#{sym}-"} 

我在这里发现gsub的匹配实际上可以通过Regexp.last_match变量(类MatchData )来访问,如下所示:

 my_string.gsub(my_regexp){ Regexp.last_match.inspect } 

为了给出更实际的示例,如果要记录所有匹配项,可以按如下方式使用:

 "Hello world".gsub(/(\w+)/) { Regexp.last_match.captures.each{ |match| Rails.logger.info "FOUND: #{match}"} } #Rails log: FOUND: Hello FOUND: world 

在您的具体情况下,您可以执行以下操作:

 mystring.gsub(/(matchthisregex)/){ mystring = "replace_with_#{Regexp.last_match[0].to_s}this"}