Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中转义一句话?_Ruby_String_Escaping - Fatal编程技术网

如何在Ruby中转义一句话?

如何在Ruby中转义一句话?,ruby,string,escaping,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("'", "\'") > =>

我通过一个脚本(不是我的)将一些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"

但是语法似乎不正确。

为什么不使用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}
还有一个往返的例子:

require 'pp'
pp JSON[some_object.to_json]
=> {
    "a string" => "this isn't escaped because JSON handles it.",
        "b" => 2
}
还有一个双引号的例子:

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\""
  }
sub(“'”,“\”)
不起作用的原因是因为
“\”
相同。在双引号中,单引号的转义是可选的

sub(“'”,“\\'”
不起作用的原因是
“\\'”
展开为一个反斜杠,后跟一个引号。在
sub
gsub
参数中,后跟一些字符的反斜杠具有与相应全局变量类似的特殊含义。特别是在这种情况下,全局变量
$”
保存最后一个匹配点之后的子字符串。在
sub
gsub
参数位置中,您的
“\\\”
引用了类似的内容。为了避免这种特殊约定,您应该将替换字符串放在块中而不是放在参数中,并且由于您不想只匹配一个,所以应该使用
gsub
而不是
sub

gsub("'"){"\\'"}

如果您试图转义单引号(撇号),则很可能还希望转义双引号。(这将适用于Javascript/JSON)

最简单的方法是使用
escape\u javascript
it“为javascript段转义回车和单引号和双引号。”

注意这只适用于RubyonRails,而不是普通Ruby。但是,您可以使用以下方法为纯Ruby制作polyfill:

JS_ESCAPE_MAP   =   { '\\' => '\\\\', '</' => '<\/', "\r\n" => '\n', "\n" => '\n', "\r" => '\n', '"' => '\\"', "'" => "\\'" }

def escape_javascript(javascript)
  if javascript
    result = javascript.gsub(/(\|<\/|\r\n|\342\200\250|\342\200\251|[\n\r"'])/u) {|match| JS_ESCAPE_MAP[match] }
  else
    ''
  end
end

JS\u ESCAPE\u MAP={'\\'=>'\\\\','尝试这种方式,使用反斜杠进行转义:

puts 'sean\'s'
输出应为:

sean's

值是如何“传递”的?因为这听起来像是一个缺陷;JSON可以很好地处理嵌入的引号,而且一旦它位于Ruby字符串中,就不要紧了。如果“通过脚本”表示子进程,那么请打开它而不创建子shell,这将在类Unix系统中完全解决此问题。(我不确定Win32的东西是否有足够的补丁来解决这个问题。)
x.sub(“'”,“\\\\”)
做你想做的事。但是铁皮人的方式是jsonify的正确方式。我使用的是JSON gem,但有些原因是它不会在客户机上运行,因为他在一个海量文本文件中提供JSON,每行一条记录,我的脚本需要做的就是通过第三方脚本将每一行推到服务器上,所以我们ixed对JSON gem的需求,它主要是在不加修饰的引号的情况下工作的。@DaveSag那么,你为什么在问题中写JSON?如果你想让人们关注字符串,为什么不在问题中这样做?为什么要求人们不要做你误导他们做的事情?不要使用JSON gem,因为它实际上不需要,也没有运行在我客户的电脑上。已经8年了,但这另一条评论仍然很新鲜不-这让
“这是一个很棒的字符串”
@DaveSag是一个反斜杠,后跟一个单引号。你如何在双引号内表达一个反斜杠,后跟一个单引号,而不转义反斜杠?让我知道。不要说你想要
“\'”
,这相当于
。这是我见过的最好答案。