2

我有一个带有两个单引号的字符串。即“女士女士的”

我想逃避引号,所以我得到:“lady\'s lady\'s”。

我尝试了以下方法:

> "lady's lady's".gsub("'", "\\'")
 => "ladys lady'ss ladyss" 

> "lady's lady's".gsub("'", "\\\\'")
 => "lady\\'s lady\\'s" 

> "lady's lady's".gsub("'", "\'")
 => "lady's lady's" 

有什么帮助吗?

4

2 回答 2

5

经典地,需要转义的字符是非字母数字。例如, Perl 会quotemeta转义不是数字、字母或下划线的所有内容。

您可以使用以下方法复制此行为gsub

str = "lady's lady's"

puts str.gsub(/(?=\W)/, '\\')

输出

lady\'s\ lady\'s

如果除了撇号转义之外您特别不想要任何东西,那么正则表达式很容易更改,替换(?=\W)(?=').


笔记

结果

> "lady's lady's".gsub("'", "\\'")
 => "ladys lady'ss ladyss" 

是因为使用文字替换字符串«\'»将每个撇号替换为全局变量的值$'- 匹配后的字符串。

所以第一个撇号被替换为«s lady's»,第二个被替换«s»,导致了奇怪的结果«ladys lady'ss ladyss»

您必须使用文字替换字符串«\\'»来替换«\'»

使用前瞻并避免替换撇号要整洁得多:

> puts "lady's lady's".gsub(/(?=')/, '\\')
lady\'s lady\'s
=> nil
于 2013-06-24T20:15:34.957 回答
3
"lady's lady's".gsub("'", "\\\\'") # => "lady\\'s lady\\'s"

正如@Neil 提到的,见下文:

"lady's lady's".gsub(/'/, "\\\\\'").chars.to_a 
# => ["l",
#     "a",
#     "d",
#     "y",
#     "\\",
#     "'",
#     "s",
#     " ",
#     "l",
#     "a",
#     "d",
#     "y",
#     "\\",
#     "'",
#     "s"]
于 2013-06-24T20:07:28.767 回答