不带捕获组的Ruby字符串替换

roqulrg3  于 2023-05-28  发布在  Ruby
关注(0)|答案(1)|浏览(137)

Ruby的String.sub(pat, txt)函数家族执行替换,并支持在txt中捕获组,即使pat是普通字符串(至少它似乎支持\0打印替换文本中的所有pat)。我不知道这是否是故意的,但如果txt是例如,则不安全。作为API输入的变量。有没有一个替代的库函数可以用来执行字符串替换而没有这个缺点?或者是另一种方法来逃避txt

vlf7wbxs

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对应于$&,它包含完整的匹配文本。
\'对应于$',包含匹配后的字符串。
\``对应于$``,它包含匹配前的字符串。
\+对应于$+,它包含最后一个捕获组。

  • https:docs.ruby-lang.org/en/3.2/String.html#class-String-label-Substitution+Methods*

相关问题