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

Tom*_*mmy 17 ruby regex gsub

如果我使用

.gsub(/matchthisregex/,"replace_with_this")
Run Code Online (Sandbox Code Playgroud)

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

"replace_with_" + matchedregexstring + "this"
Run Code Online (Sandbox Code Playgroud)

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

mu *_*ort 33

精细手册:

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

如果您不关心捕获组(例如(expr)正则表达式中的内容),那么您可以使用块形式和$&:

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

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

>> 'where is pancakes house?'.gsub(/(is)/, '-\1-')
=> "where -is- pancakes house?"
Run Code Online (Sandbox Code Playgroud)

$n在街区:

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

  • 是的,```````````` 我没有注意到 我认为评论有时可以预览. (2认同)

cla*_*219 5

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

my_string.gsub(my_regexp){ Regexp.last_match.inspect }
Run Code Online (Sandbox Code Playgroud)

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

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

#Rails log:
FOUND: Hello
FOUND: world
Run Code Online (Sandbox Code Playgroud)

在您的特定情况下,您可以执行以下操作:

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


dev*_*lip 5

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

.gsub(/matched_sym/) {|sym| "-#{sym}-"}
Run Code Online (Sandbox Code Playgroud)