Gsub导致部分字符串被替换

时间:2016-01-22 01:33:09

标签: ruby regex string

我想用反斜杠单引号(')替换所有出现的单引号(\')。我尝试使用gsub执行此操作,但我得到了部分字符串重复:

a = "abc 'def' ghi"
a.gsub("'", "\\'")
# => "abc def' ghidef ghi ghi"

有人可以解释为什么会发生这种情况以及解决方案是什么?

3 个答案:

答案 0 :(得分:3)

这是因为"\\'"作为gsub的替换参数出现时具有特殊含义,即它意味着匹配后的子字符串。

要做你想做的事,你可以使用一个块:

a.gsub("'"){"\\'"}
# => "abc \\'def\\' ghi"

请注意,反斜杠在字符串检查中被转义,因此它显示为\\

答案 1 :(得分:3)

您的"\\'"实际上代表文字\',因为反斜杠会转义下一个反斜杠。 Ruby正则表达式中的文字\'实际上是一个特殊变量,它插入匹配部分后面的字符串部分。所以这就是发生的事情。

abc 'def' ghi
    ^

插入符号指向第一个匹配项'。将其替换为右侧的所有内容, def' ghi

abc def' ghidef' ghi
    ++++++++

现在找到下一场比赛:

abc def' ghidef' ghi
               ^

再次将'替换为右侧的所有内容, ghi

abc def' ghidef ghi ghi
               ++++

答案 2 :(得分:2)

你可能需要更高剂量的逃避:

from collections import defaultdict

size_counts = defaultdict(int)
for size, cnt in zip(shoesizes, quantities):
    size_counts[size] += cnt

orderedsizes, totalquant = map(list, zip(*sorted(size_counts.items())))

<强>结果

  

abc \'def \'ghi