【问题标题】:How can I individually quote words in a string separated by pipe characters?如何单独引用由管道字符分隔的字符串中的单词?
【发布时间】:2013-07-29 17:21:30
【问题描述】:

我的参数哈希包含字符串值,如:

маслёнка | масло

我的方法目前有这个代码:

s = %Q{(@content "#{params[:structure]}")}

这引用了整个字符串:

(@content "маслёнка | масло")

但我需要像这样单独引用每个元素:

(@content "маслёнка" | "масло")

我知道我需要通过 | 符号将我的参数字符串拆分为子字符串,但元素需要单独引用并用管道字符分隔。我该怎么做?

【问题讨论】:

  • 这听起来像是 X/Y 问题。您真正想用这个字符串做什么,为什么要在控制器中进行复杂的转义/引用?
  • @CodeGnome 需要这个用于狮身人面像

标签: ruby-on-rails ruby string split escaping


【解决方案1】:
input.split(" | ").map {|s| "\"" + s + "\""}.compact.join(" | ")

会得到你想要的。

【讨论】:

  • 另见discussion on %q
  • 我也可以在没有 | 的情况下设置参数只是空间
  • 随心所欲。我将此解释为回答您的原始问题:“word1 | word2”-> “\”word1\” | \“word2\””。如果您不需要/想要管道,只需在最后更改join。如果您的意思是 params[:structure] 可能不带 |,只需检查并更改 split
【解决方案2】:

在拆分后引用您的数组元素

您的问题是由您的报价要求的复杂性引起的。解决此问题的一种方法是使用 Kernel#sprintf 和 Ruby 的备用双引号文字 (%Q) 来构建您的字符串。例如:

s = sprintf '(@content %s)',
            params[:structure].split( /\s+\|\s+/ ).
            map { |elem| %Q["#{elem}"] }.
            join(" | ")
# => "(@content \"маслёнка\" | \"масло\")"

您可以使用Kernel#puts 验证字符串是否正确转义,在这种情况下会产生:

(@content "маслёнка" | "масло")

【讨论】:

    【解决方案3】:

    这会将params 哈希拆分为由| 分隔的字符串,但不会保留实际的| 字符。

    s = %Q{(@content "#{params[:structure].split('|')}")}

    【讨论】:

    • 我可以在没有 | 的情况下设置参数只是空间
    • 如果我正确理解了原始问题,您正在尝试拆分以“|”分隔的字符串。您也可以通过将 split 参数更改为 .split(' ') 来将其拆分为空格
    • split: 是的...但也将所有这些拆分的值转换为 "" 并设置 |他们之间
    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多