Ruby regex- gsub 是不是存储它匹配的内容?

Posted

技术标签:

【中文标题】Ruby regex- gsub 是不是存储它匹配的内容?【英文标题】:Ruby regex- does gsub store what it matches?Ruby regex- gsub 是否存储它匹配的内容? 【发布时间】:2013-03-27 07:11:52 【问题描述】:

如果我使用

.gsub(/matchthisregex/,"replace_with_this")

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

"replace_with_" + matchedregexstring + "this"

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

【问题讨论】:

【参考方案1】:

来自fine manual:

如果 replacementString,它将被替换为匹配的文本。它可能包含对模式捕获组的反向引用,格式为\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?"

【讨论】:

啊哈! - 所以出现在文档中的额外 `` 只是来自 Rdoc 的人工制品。我一直在摸不着头脑,试图弄清楚它们的意思。 @matt:你的意思是多余的反斜杠,对吧? #*$ Markdown,查看我的 $-backtick 变量以获得更多乐趣 :) 是的,如果你使用双引号,你需要说 \\1,但如果你使用单引号,\1 很好(我总是这样做除非我需要插值)。 是的,\ 不是 ``。我没有注意到。我认为 cmets 有时可以进行预览。【参考方案2】:

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

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_sthis"

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于Ruby regex- gsub 是不是存储它匹配的内容?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 匹配第一次出现的字符串以进行 gsub 替换

在 Ruby gsub 块中使用命名的捕获组(正则表达式)

如何在许多匹配项中使用 ruby​​ gsub Regexp?

使用regex匹配Ruby子字符串,并像索引一样引用它

带有索引/偏移量的Ruby gsub?

在REGEX中选择引号但不是撇号