如何逃避Ruby中的单引号?

Dav*_*Sag 23 ruby string escaping

我通过脚本(不是我的)将一些JSON传递给服务器,该脚本接受JSON作为字符串.

JSON的某些内容包含单引号,因此我希望确保在传递给脚本之前对任何单引号进行转义.

我尝试过以下方法:

> irb
> 1.9.3p194 :001 > x = "that's an awesome string"
>  => "that's an awesome string" 
> 1.9.3p194 :002 > x.sub("'", "\'")
>  => "that's an awesome string" 
> 1.9.3p194 :003 > x.sub("'", "\\'")
>  => "thats an awesome strings an awesome string"
Run Code Online (Sandbox Code Playgroud)

但似乎无法使语法正确.

saw*_*awa 34

sub("'", "\'")不起作用的原因是因为"\'"是一样的"'".在双引号内,单引号的转义是可选的.

原因sub("'", "\\'")不起作用是因为"\\'"扩展为反斜杠后跟单引号.在一个sub或多个gsub参数中,反斜杠后跟一些字符具有与相应的全局变量相当的特殊含义.特别是在这种情况下,全局变量$'在最后一个匹配点之后保存子字符串.你的"\\'"内部subgsub论点位置指的是类似的东西.为了避免这种特殊约定,你应该将替换字符串放在一个块而不是一个参数中,并且由于你不想只匹配一个,你应该使用gsub而不是sub:

gsub("'"){"\\'"}
Run Code Online (Sandbox Code Playgroud)

  • @DaveSag这是一个反斜杠后跟一个单引号.你怎么用双引号表示一个反斜杠后跟一个单引号而不逃避反斜杠?让我知道.不要说你想要``\'"`,这相当于``''``. (9认同)
  • 我见过的最佳答案。 (2认同)

the*_*Man 3

为什么不使用 JSON gem?

require 'json'
some_object = {'a string' => "this isn't escaped because JSON handles it.", 'b' => 2}

puts some_object.to_json
=> {"a string":"this isn't escaped because JSON handles it.","b":2}
Run Code Online (Sandbox Code Playgroud)

还有一个往返示例:

require 'pp'
pp JSON[some_object.to_json]
=> {
    "a string" => "this isn't escaped because JSON handles it.",
        "b" => 2
}
Run Code Online (Sandbox Code Playgroud)

还有一个带双引号的示例:

some_object = {
  'a string'       => "this isn't escaped because JSON handles it.",
  'another string' => 'double-quotes get "escaped"'
}
puts some_object.to_json
=> {
            "a string" => "this isn't escaped because JSON handles it.",
      "another string" => "double-quotes get \"escaped\""
  }
Run Code Online (Sandbox Code Playgroud)