【问题标题】:How to modify string in Ruby such that all instances of apostrophe are replaced with backslash apostrophe如何在 Ruby 中修改字符串,以便将所有撇号实例替换为反斜杠撇号
【发布时间】:2020-02-21 07:23:52
【问题描述】:

我想将“This is Bob's sentence”这样的字符串修改为“This is Bob\'s sentence”

我的研究似乎表明以下应该有效

"This is Bob's sentence".gsub("'", "\\'")

但我得到的结果是

“这是 Bobs 消息消息”

我在 Rails 应用程序中执行此操作。也许应用程序中的其他东西导致了这个问题?如果你能告诉我一个你知道应该工作的红宝石方法,我将不胜感激。提前致谢。

【问题讨论】:

标签: ruby-on-rails ruby text escaping


【解决方案1】:

您可以像这样使用捕获:

puts "This is Bob's sentence".gsub(/(\w\')/, '\1\\')
This is Bob'\s sentence

您可以在正则表达式中捕获括号 () 中的内容,然后您可以使用 \1 对其进行修改。您可以拥有多个捕获组,它们按出现的顺序编号。

更多见类似例子https://ruby-doc.org/core-2.7.0/String.html#gsub

【讨论】:

  • 非常感谢。但是,当字符串在变量中时,这似乎对我不起作用:foo = "This is Bob's sentence" foo.gsub(/(\w\')/, '\1\\') => "This is Bob'\\s sentence"
  • 另外,我需要撇号前面的反斜杠。
  • Ruby 控制台会转义反斜杠,但字符串实际上是正确的。
【解决方案2】:

mu 引用的每个线程太短

"This is Bob's sentence".gsub("'", "\\\\\'")

【讨论】:

  • 是的,当每个人都想使用反斜杠而你最终逃脱了逃脱的转义时,这有点可怕。
【解决方案3】:

这很烦人,但这里有一个可行的解决方案:

sentence = "This is Bob's sentence"
sent_arr = sentence.gsub("'", "\\").split('')
sent_arr.each_index.select{|i| sent_arr[i] == "\\"}.each{|i| sent_arr.insert(i+1, "'") }
final_sentence = sent_arr.join
puts final_sentence

基本上:

  1. "'" 替换为"\\"(仅计为一个索引),从中创建一个数组。
  2. 在数组中查找"\\" 的每个索引,在每个索引之后的位置插入一个"'"
  3. 将数组加入字符串。

尽管变量似乎有两个反斜杠实例 (\\),但当您 puts 变量时,您会看到它只有一个。

(具有讽刺意味的是,如果您不以代码形式将其放入此响应中,即使 StackOverflow 也会在此响应中转义反斜杠...我不得不放 3 个反斜杠以使其看起来像 2!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多