如果我使用
.gsub(/matchthisregex/,"replace_with_this")
gsub 会在某处存储与正则表达式匹配的内容吗?我想在我的替换字符串中使用它匹配的内容。例如像
"replace_with_" + matchedregexstring + "this"
在我上面的示例中,matchedregexstring 将是 gsub 中存储的匹配项?抱歉,如果这令人困惑,我不知道该怎么说。
来自精美手册:
如果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?"
我在这里发现 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"}
对于所有 ruby 版本:获取匹配字符串的简单方法。
.gsub(/matched_sym/) {|sym| "-#{sym}-"}