0

我正在尝试转义字符串中的某些字符。特别想转

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"

...我得到了替换工作,但是,当然,我的前缀不是其中的一部分。

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

4

3 回答 3

1

这应该更容易

gsub(/(?=[.\/])/, "\\")
于 2013-04-04T16:29:53.623 回答
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/

文档

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

Regexp.escape('\*?{}.')   #=> \\\*\?\{\}\.
于 2013-04-04T17:34:46.683 回答
0

您可以将块传递给gsub

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

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

于 2013-04-04T16:45:55.983 回答