我试图逃避字符串中的某些字符。特别是,我想转
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"
...我得到了替代工作,但是,当然,我的前缀不属于它。
做这样的事情的正确语法是什么?
答案 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的回答那么优雅,但如果您需要替换字符串来包含捕获的组/反向引用(而不是在前瞻之前插入替换),这是我能找到的唯一方法)。