繁体   English   中英

删除 ruby​​ 字符串中的“\\”字符

[英]remove "\" character in ruby string

我认为这是一个愚蠢的问题,但我找不到解决此问题的任何方法,也许你们可以帮助我。 所以我有一个这样的字符串:

str = "my name is \"leo\""

我想将该值传递给其他变量,因此新变量将具有如下值:

"my name is "leo""

我已经使用gsubchompdelete来删除\\但这不起作用。 但是,当我使用print\\字符消失了,但是当我使用p ,该字符仍然可见,如下所示:

(byebug) str = "my name is \"leo\""
 "my name is \"leo\""
(byebug) p str
 "my name is \"leo\""
 "my name is \"leo\""
(byebug) print str
 my name is "leo"nil

我希望我能找到答案,谢谢大家!

字符串中没有反斜杠。 str = "my name is \\"leo\\""中的反斜杠只是为了阻止嵌入的引号提前终止字符串并使其其余部分成为语法错误。 Ruby 调试器使用在文字 Ruby 表达式中表示该字符串值所需的相同语法向您显示字符串,因此它向您显示反斜杠,但字符串中没有任何反斜杠。

你可以用各种不同的方式来检查它来向自己证明这一点。

str.length #=> 16

如果反斜杠是字符串的一部分,那就是 18。

str.chars
#=> ["m", "y", " ", "n", "a", "m", "e", " ", "i", "s", " ", "\"", "l", "e", "o", "\""]

“啊哈!” 你说。 “反斜杠!” 除了注意他们不是他们自己的角色; 它们与双引号属于同一字符串。 chars的全部工作是使每个字符成为自己的字符串时,为什么要将两个字符组合在一起? 它没有 - 每个都只是单个字符'"' 。但是 Ruby shell(IRB,byebug,无论您使用什么)使用#inspect方法显示字符串,而该方法总是使用双引号。所以无论何时一个字符串里面有任何双引号,你会在它们前面得到反斜杠。

 (byebug) '"'
 "\""

在那里你可以看到我什至没有输入反斜杠——我没有必要这样做,因为我使用了单引号而不是双引号。 但是 shell 总是使用双引号显示值,它需要反斜杠。

不要将字符串源代码中的文字表示与字符串的实际值混淆。 如果字符串包含换行符,则它是具有数值 10 的单个字符,而不是后跟n的反斜杠。 如果字符串包含制表符,则它是具有数值 9 的单个字符,而不是后跟t的反斜杠。 如果一个字符串包含一个双引号,那是一个数字值为十进制 34 的单个字符,任何地方都没有反斜杠。

以下是从评论中获取字符串的方法:

str="hmac username=\"USERNAME\", algorithm=\"hmac-sha256\", headers=\"date request-line\", signature=\"sd4XNv5L+z2sLvgkWfcMKEe8vRb89wq33K1F6hibcYk=\"" 

或者,您可以使用%Q( ... )代替双引号:

str=%Q(hmac username="USERNAME", algorithm="hmac-sha256", headers="date request-line", signature="sd4XNv5L+z2sLvgkWfcMKEe8vRb89wq33K1F6hibcYk="" 

无论哪种方式,您都可以通过用#{ ... }表达式替换文字来插入值。 无论哪种方式,如果您查看 byebug 中的字符串值,您仍然会看到反斜杠双引号,因为这正是 byebug 将它们打印出来的方式。

如果您想要一些真正有趣的递归,请自行调用inspect并查看打印出的字符串的表示作为表示。 重复品尝!

str
=> "my name is \"leo\""
irb(main):013:0> str.inspect
=> "\"my name is \\\"leo\\\"\""
irb(main):014:0> str.inspect.inspect
=> "\"\\\"my name is \\\\\\\"leo\\\\\\\"\\\"\""
irb(main):015:0> str.inspect.inspect.inspect
=> "\"\\\"\\\\\\\"my name is \\\\\\\\\\\\\\\"leo\\\\\\\\\\\\\\\"\\\\\\\"\\\"\""

您必须区分字符串文字字符串值

字符串文字是您输入以生成字符串的内容,包括周围的引号:

str = "hello, world"
#     ^^^^^^^^^^^^^^
#     string literal

如果您检查 IRB、Pry 或 Byebug 中的字符串,它将以其文字形式打印回给您:

str
#=> "hello, world"

另一方面,字符串值是字符串实际包含的字符序列。 在上面的例子中,这将是引号之间的 12 个字符,即:

h e l l o , w o r l d


现在,如果您想在双引号字符串中包含双引号,则必须使用反斜杠对其进行转义:(就像您所做的那样)

str = "my name is \"leo\""

在检查字符串时,Byebug 将以其文字形式将其打印回给您:

str
#=> "my name is \"leo\""

但这些引号只是为了显示目的而添加的。 尽管输出,字符串值是:

m y n a m e i s " l e o "

所以你的字符串没有问题。 只是 Byebug 的输出在您看来有点奇怪。

您可以愉快地按原样传递字符串,它不包含任何反斜杠。


如果您必须同时输入双引号和插值字符串,Ruby 提供了另一个字符串文字: %Q(...) – 它允许您输入双引号而不转义:

name = "leo"
str = %Q(my name is "#{ name }")
#=> "my name is \"leo\""

(当然,Byebug 会再次显示反斜杠,但如前所述,这只是为了显示目的)

您将字符串数据与其在一种语言(在本例中为 Ruby)中的表示相混淆。

str变量的值是my name is "leo" 里面没有任何\\ 您可以通过打印其值来检查这一点:

code = "my name is \"leo\""

puts code

看到它在行动。

需要\\字符来将该值表示为 Ruby 中的代码。 引号 ( " ) 是语言用来将字符串数据括起来的特殊字符。当编译器解析代码并到达部分code = "它知道将向变量code分配一个类型为string (即文本数据)。

没有\\ ,当编译器到达片段"leo"它认为字符串在这里结束。 因为您希望在字符串中包含" ,所以必须以某种方式告诉编译器" leo单词周围的"字符没有语言语法规则指定的特殊含义,但必须表示它们自己。 这就是\\来救援的地方。 它“转义”跟随它的字符,并告诉编译器不要以任何特殊方式解释它,而是按原样接受它。

总而言之,符号\\"被用来表示"被分隔的字符串内"\\'被用来表示'由分隔的字符串'\\\\用于表示一个\\在字符串中,无论如何分隔字符串中的特殊字符还有其他转义序列,它们都以\\开头,但它们是语言约定; \\不存在于数据中。

p方法调用inspect ,其目的是帮助调试代码; 因此,它显示技术信息(例如编码为 Ruby 代码的文本数据)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM