用相同的捕获和额外的字符串替换正则表达式捕获

时间:2013-04-04 16:23:10

标签: ruby regex

我试图逃避字符串中的某些字符。特别是,我想转

abc/def.ghi加入abc\/def\.ghi

我尝试使用以下语法:

1.9.3p125 :076 > "abc/def.ghi".gsub(/([\/.])/, '\\\1')
 => "abc\\1def\\1ghi" 

嗯。这表现为捕获替换不起作用。然而,当我尝试这个时:

1.9.3p125 :075 > "abc/def.ghi".gsub(/([\/.])/, '\1')
 => "abc/def.ghi"

...我得到了替代工作,但是,当然,我的前缀不属于它。

做这样的事情的正确语法是什么?

3 个答案:

答案 0 :(得分:1)

这应该更容易

gsub(/(?=[.\/])/, "\\")

答案 1 :(得分:1)

如果您正在尝试准备要用作正则表达式模式的字符串,请使用正确的工具:

Regexp.escape('abc/def.ghi')
=> "abc/def\\.ghi"

然后,您可以使用生成的字符串创建正则表达式:

/#{ Regexp.escape('abc/def.ghi') }/
=> /abc\/def\.ghi/

或:

Regexp.new(Regexp.escape('abc/def.ghi'))
=> /abc\/def\.ghi/

来自the docs

  

转义任何在正则表达式中具有特殊含义的字符。返回一个新的转义字符串,如果没有转义字符,则返回self。对于任何字符串,Regexp.new(Regexp.escape(str))=〜str将为真。

Regexp.escape('\*?{}.')   #=> \\\*\?\{\}\.

答案 2 :(得分:0)

您可以将一个块传递给gsub

>> "abc/def.ghi".gsub(/([\/.])/) {|m| "\\#{m}"}
=> "abc\\/def\\.ghi"

不像@ sawa的回答那么优雅,但如果您需要替换字符串来包含捕获的组/反向引用(而不是在前瞻之前插入替换),这是我能找到的唯一方法)。