2013-04-05 81 views
16

如果我使用Ruby正则表达式 - gsub存储它匹配的内容吗?

.gsub(/matchthisregex/,"replace_with_this") 

做GSUB存储它所用正则表达式匹配的地方?我想使用它在我的替换字符串中匹配的内容。例如像

"replace_with_" + matchedregexstring + "this" 

在我上面的例子,其中matchedregexstring会从GSUB存储的比赛?对不起,如果这是令人困惑的,我不知道该怎么说。

回答

29

fine manual

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

如果你不关心捕获组(即东西像正则表达式(expr)),那么你可以使用块形式和$&:如果你有捕捉组,那么你可以

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

在块

>> 'where is pancakes house?'.gsub(/(is)/, '-\1-') 
=> "where -is- pancakes house?" 

$n或:在替换字符串使用\n

>> 'where is pancakes house?'.gsub(/(is)/) { "-#{$1}-" } 
=> "where -is- pancakes house?" 
+0

啊哈! - 所以文档中出现的额外'\'只是来自Rdoc的人工制品。我一直在摸索着想弄明白他们的意思。 – matt 2013-04-05 01:46:31

+0

@matt:你的意思是额外的反斜杠,对吧? #*&#$ Markdown,请参阅我的$ -backtick变量以获得更多乐趣:)是的,如果您使用双引号,则需要说'\\ 1',但如果您使用单引号我总是这样做,除非我需要插值)。 – 2013-04-05 01:49:47

+2

是的,'''''''不是''。我没有注意到。我认为评论有时候可以做预览。 – matt 2013-04-05 01:54:37

1

我发现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"} 
3

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

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