Ruby的String.sub(pat, txt)函数家族执行替换,并支持在txt中捕获组,即使pat是普通字符串(至少它似乎支持\0打印替换文本中的所有pat)。我不知道这是否是故意的,但如果txt是例如,则不安全。作为API输入的变量。有没有一个替代的库函数可以用来执行字符串替换而没有这个缺点?或者是另一种方法来逃避txt。
String.sub(pat, txt)
txt
pat
\0
vlf7wbxs1#
你是说像这样
>> "mytext".sub("text", " \\0 replaced by \\` \\0") => "my text replaced by my text"
您可以转义反斜杠:
>> "mytext".sub("text", " \\\\0 replaced") => "my \\0 replaced" def b_esc(str) = str.gsub("\\", "\\\\\\\\") >> "mytext".sub("text", b_esc(" \\0 replaced")) => "my \\0 replaced" # how many backslashes? >> "\\0".chars #=> ["\\", "0"] # uhh.. yes >> "\\0".bytes #=> [92, 48] # one ^ >> b_esc("\\0").bytes #=> [92, 92, 48] # two ^ ^
或者使用块:
>> "mytext".sub("text") { " \\0 replaced" } => "my \\0 replaced"
或者[]=:
[]=
>> t = "mytext" => "mytext" >> t["text"] = " \\0 replaced" => " \\0 replaced" >> t => "my \\0 replaced"
请注意,在字符串替换中,像$&这样的字符组合被视为普通文本,而不是特殊的匹配变量。但是,您可以使用以下组合引用一些特殊的匹配变量:\&和\0对应于$&,它包含完整的匹配文本。\'对应于$',包含匹配后的字符串。\``对应于$``,它包含匹配前的字符串。\+对应于$+,它包含最后一个捕获组。
$&
\&
\'
$'
\``对应于
\+
$+
1条答案
按热度按时间vlf7wbxs1#
你是说像这样
您可以转义反斜杠:
或者使用块:
或者
[]=
:请注意,在字符串替换中,像
$&
这样的字符组合被视为普通文本,而不是特殊的匹配变量。但是,您可以使用以下组合引用一些特殊的匹配变量:\&
和\0
对应于$&
,它包含完整的匹配文本。\'
对应于$'
,包含匹配后的字符串。\``对应于
$``,它包含匹配前的字符串。\+
对应于$+
,它包含最后一个捕获组。