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

时间:2013-04-05 01:06:47

标签: ruby regex gsub

如果我使用

.gsub(/matchthisregex/,"replace_with_this")

gsub会在正确的位置存储与正则表达式匹配的内容吗?我想在替换字符串中使用它匹配的内容。例如

之类的东西
"replace_with_" + matchedregexstring + "this"

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

3 个答案:

答案 0 :(得分:33)

来自fine manual

  

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

如果你不关心捕获组(例如正则表达式中的(expr)之类的东西),那么你可以使用阻止形式和$&

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

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

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

$n

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

答案 1 :(得分:4)

我发现here 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"}

答案 2 :(得分:4)

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

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