2013-04-05 52 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}-"}