不带regex back引用的Ruby字符串sub

不带regex back引用的Ruby字符串sub,ruby,string,replace,Ruby,String,Replace,我正在尝试用Ruby做一个简单的字符串sub sub()的第二个参数是一长段小型JavaScript,其中包含正则表达式。这个字符串中正则表达式中的反向引用似乎影响了sub的结果,因为被替换的字符串(即第一个参数)出现在输出字符串中 例如: input = "string <!--tooreplace--> is here" output = input.sub("<!--tooreplace-->", "\&") 不是: 或者如果逃离正则表达式 "string

我正在尝试用Ruby做一个简单的字符串sub

sub()的第二个参数是一长段小型JavaScript,其中包含正则表达式。这个字符串中正则表达式中的反向引用似乎影响了sub的结果,因为被替换的字符串(即第一个参数)出现在输出字符串中

例如:

input = "string <!--tooreplace--> is here"
output = input.sub("<!--tooreplace-->", "\&")
不是:

或者如果逃离正则表达式

"string <!--tooreplace--> is here"
“字符串在这里”

基本上,我想要一种完全没有正则表达式后果的字符串替换方法—只需简单的字符串替换。

使用单引号并转义反斜杠:

output = input.sub("<!--tooreplace-->", '\\\&') #=> "string \\& is here"
output=input.sub(“,”\\\&')\\=>string\\&在这里

为避免必须找出如何转义替换字符串,请使用。当替换很复杂,或者处理它是一种不必要的痛苦时,它很方便。绳子上的一个小助手也不错

input.sub("<!--toreplace-->", Regexp.escape('\&'))
input.sub(“,Regexp.escape('\&'))

您还可以使用块表示法使其更简单(与Regexp.escape相反):

=>将input.sub(“”{'\&'}
字符串\&在这里

既然
\\\&
(也就是说,
\
后面跟着
&
)被解释为一个特殊的正则表达式语句,因此您需要避开反斜杠是有道理的。事实上,这是有效的:

>> puts 'abc'.sub 'b', '\\\\&'
a\&c

请注意,
\\\&
表示文本字符串
\\&

您可以创建一个小示例来演示该问题吗?它修复了该示例,但似乎会在其他地方导致问题。例如,如果将第二个参数更改为“\&,O=/\s*([\s\+\~>])\s*/g”,则输出看起来像“string\&,O=/\s*([\s\\\~>])\s*/g在这里”,并转义了大量额外的内容。非常有用-尤其是当它适用于其他用途时(例如,读取文件并将文件内容用作替换字符串)在这种情况下,转义根本不是一种选择。
input.sub("<!--toreplace-->", Regexp.escape('\&'))
=> puts input.sub("<!--tooreplace-->") {'\&'}
string \& is here
>> puts 'abc'.sub 'b', '\\\\&'
a\&c