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:
如果 replacement 是
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?"
【讨论】:
啊哈! - 所以出现在文档中的额外 `` 只是来自 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 是不是存储它匹配的内容?的主要内容,如果未能解决你的问题,请参考以下文章