gsub将字符串中的转义单引号转义为双引号

时间:2018-12-19 23:42:18

标签: ruby string

我有以下输入字符串:

string = "\"Newegg.com\" <Promo@email.newegg.com>"

我想用\"代替\'。我尝试过:

string.gsub(/\"/) {|i| "\\'" }
# => "\\'Newegg.com\\' <Promo@email.newegg.com>"

string.gsub(/\"/,%q(\\\'))
# => "\\'Newegg.com\\' <Promo@email.newegg.com>"

在两种方式中,它实际上都有两个\实例,但是我只想要一个。反斜杠和转义b / c似乎是一个问题,否则可以正常工作:

string.gsub(/\"/,%q('))
# => "'Newegg.com' <Promo@email.newegg.com>"

-更新1-- 是的,看跌期权确实显示“正确”的值

temp = string.gsub(/\"/,%q(\\\'))
# => "\\'Newegg.com\\' <Promo@email.newegg.com>"
puts temp
# >> \'Newegg.com\' <Promo@email.newegg.com>

但是我想存储显示在最后一行的确切值。

2 个答案:

答案 0 :(得分:1)

您的实际字符串不包含\

puts "\"Newegg.com\" <Promo@email.newegg.com>"
> "Newegg.com" <Promo@email.newegg.com>

这将按照您的期望将"替换为'

puts "\"Newegg.com\" <Promo@email.newegg.com>".gsub('"', "'")
> 'Newegg.com' <Promo@email.newegg.com>

如果您确实想要\",请尝试另一个转义字符,例如:

puts "\\\"Newegg.com\\\" <Promo@email.newegg.com>"
> \"Newegg.com\" <Promo@email.newegg.com>

相同的替换应该起作用:

puts "\\\"Newegg.com\\\" <Promo@email.newegg.com>".gsub('"', "'")
> \'Newegg.com\' <Promo@email.newegg.com>

答案 1 :(得分:0)

看起来您对返回的结果有些困惑(可以理解的是)。 请记住,在irb中,最后一个结果使用.inspect进行格式化,这意味着它将字符串用双引号引起来,然后转义需要在双引号中转义的字符(反斜杠和双引号)。串。这是为了区分字符串和其他值,例如数字,数组,哈希等。

但是,这仅仅是检查的结果。如果使用puts输出值,则将输出它而没有任何转义-这是您的值的更精确表示。puts显示的值是实际值,如果将值保存到变量中,将存储的内容

如果您仍然不知道字符串的样子,请尝试以下操作:

temp = string.gsub(/\"/,%q(\\\'))

temp.split('')
=> ["\\", "'", "N", "e", "w", "e", "g", "g", ".", "c", "o", "m", "\\", "'", " ", "<", "P", "r", "o", "m", "o", "@", "e", "m", "a", "i", "l", ".", "n", "e", "w", "e", "g", "g", ".", "c", "o", "m", ">"]

这会将您的字符串分解为单个字符的数组,并使您更容易准确地看到字符串中的内容。请注意,您有一个\字符(显示为"\\",但是由于确保每个字符串的长度正好是一个字符,因此您知道由于检查而以这种方式显示了它)和一个{{1} }开头的字符。