21

如果我使用

.gsub(/matchthisregex/,"replace_with_this")

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

"replace_with_" + matchedregexstring + "this"

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

4

3 回答 3

36

来自精美手册

如果replacement是a String,它将替换匹配的文本。它可能包含对模式捕获组的反向引用,格式为\d,其中d是组号,或者\k<n>,其中n是组名。如果它是双引号字符串,则两个反向引用都必须以附加的反斜杠开头。但是,在替换中,特殊匹配变量,例如&$,不会引用当前匹配。
[...]
在块形式中,当前匹配字符串作为参数传入,变量如$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?"
于 2013-04-05T01:42:19.607 回答
6

我在这里发现 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"}
于 2014-09-02T11:21:42.907 回答
5

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

.gsub(/matched_sym/) {|sym| "-#{sym}-"}
于 2015-06-08T19:20:30.537 回答