如果我使用
.gsub(/matchthisregex/,"replace_with_this")
gsub会在正确的位置存储与正则表达式匹配的内容吗?我想在替换字符串中使用它匹配的内容。例如
之类的东西"replace_with_" + matchedregexstring + "this"
在上面的示例中,matchedregexstring将是来自gsub的存储匹配?对不起,如果这令人困惑,我不知道怎么说。
答案 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}-"}