正在转义的红宝石字符串



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

我想避开这些引号,所以我得到了:"女士的女士的"。

我尝试过以下几种:

> "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" 

有什么帮助吗?

传统上,需要转义的字符是非字母数字字符。例如,Perl的quotemeta可以转义所有不是数字、字母或下划线的内容。

您可以使用gsub:复制这种行为

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

输出

lady's lady's

如果您特别不希望转义撇号以外的任何内容,那么regex很容易更改,用(?=')替换(?=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
"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"]

最新更新