gpt4 book ai didi

ruby - 为什么 Ruby gsub 不替换第二次出现的这种模式?

转载 作者:数据小太阳 更新时间:2023-10-29 08:31:57 25 4
gpt4 key购买 nike

我有一些代码可以从可能包含预转义引号的字符串中转义双引号;例如:

This is a \"string"

在 Ruby 1.8.7p374 中使用以下代码:

string.gsub!(/([^\\])"/, '\1\"')

但是,在以下字符串上尝试时,我遇到了一些有趣的边缘情况:ab""c => ab\""c。我希望它能避开两个引号。

这绝对不是什么大问题,但让我很好奇。
这是我表达的错误吗? gsub 错误/功能?

(在较新的 Ruby 版本中,这可能可以通过使用负回溯轻松解决,但此版本似乎不支持)。

最佳答案

要求与非 \ 字符匹配意味着正则表达式需要消耗该字符以及引号。 gsub 匹配项也不能重叠。

你是对的,回顾断言可以解决这个问题。但是如果没有它,您在 Ruby 1.8.7 中有几个选择。

  1. 重复直到没有替换(如果没有匹配,gsub! 返回 nil):

    loop { break unless string.gsub!(/([^\\])"/, '\1\"') }

  2. 对于 1.8.7,您没有回顾断言。但是您可以反转字符串,使用先行断言进行更改,然后将其反转回来:

    string = string.reverse.gsub(/"(?!\\)/, '"\\').reverse

关于ruby - 为什么 Ruby gsub 不替换第二次出现的这种模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24353070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com