【问题标题】:Gsub causing part of string to be substitutedGsub 导致部分字符串被替换
【发布时间】:2016-01-23 01:02:57
【问题描述】:

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

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

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

【问题讨论】:

标签: ruby regex string


【解决方案1】:

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

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

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

注意反斜杠在字符串检查中被转义了,所以它显示为\\

【讨论】:

  • 你不需要使用块形式;你只需要在\' 前面加上另一个\,在双引号中看起来像"\\\\'":a.gsub("'", "\\\\'")
【解决方案2】:

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

abc 'def' ghi
    ^

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

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

现在找到下一个匹配项:

abc def' ghidef' ghi
               ^

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

abc def' ghidef ghi ghi
               ++++

【讨论】:

  • 感谢您的详尽解释!
【解决方案3】:

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

a.gsub(/'/, "\\\\'" )

结果

abc \'def\' ghi

【讨论】:

  • 这和 a.gsub("'", "\\\\'") 一样
猜你喜欢
  • 1970-01-01
  • 2013-08-17
  • 2010-09-12
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 2013-09-05
  • 2021-10-30
  • 2012-07-17
相关资源
最近更新 更多