【问题标题】:Split a string with multiple delimiters in Ruby在 Ruby 中拆分具有多个分隔符的字符串
【发布时间】:2011-06-01 20:34:13
【问题描述】:

例如,我有一个这样的字符串:

options = "Cake or pie, ice cream, or pudding"

我希望能够通过or,, or 拆分字符串。

问题是,我能够做到这一点,但只能通过首先解析 ,, or,然后在 or 处拆分每个数组项,然后将结果数组展平:

options = options.split(/(?:\s?or\s)*([^,]+)(?:,\s*)*/).reject(&:empty?);
options.each_index {|index| options[index] = options[index].sub("?","").split(" or "); }

结果数组如下:["Cake", "pie", "ice cream", "pudding"]

有没有更有效(或更简单)的方法可以在这三个分隔符上分割我的字符串?

【问题讨论】:

    标签: ruby string delimiter


    【解决方案1】:

    由于"or""," 做同样的事情,最好的方法是告诉正则表达式应该将多个案例视为一个案例:

    options = "Cake or pie, ice cream, or pudding"
    regex = /(?:\s*(?:,|or)\s*)+/
    options.split(regex)
    

    【讨论】:

      【解决方案2】:

      下面的呢:

      options.gsub(/ or /i, ",").split(",").map(&:strip).reject(&:empty?)
      
      • 替换除 , 之外的所有分隔符
      • 将其拆分为,
      • 修剪每个字符,因为可能会留下诸如 ice cream 之类的带有前导空格的内容
      • 删除所有空白字符串

      【讨论】:

      • 看起来更容易阅读,虽然有两点:一,&:empty 应该改成&:empty?,二," or " 可以改成/ or /i 以容纳大写的' OR' 也是如此。
      • 谢谢 - &:empty 甚至不起作用,我确实用 &:empty? 进行了测试;并且正则表达式也是一个方便的补充。
      【解决方案3】:

      首先,你的方法可以用Array#flatten简化一点:

      >> options.split(',').map{|x|x.split 'or'}.flatten.map(&:strip).reject(&:empty?)
      => ["Cake", "pie", "ice cream", "pudding"]
      

      我更喜欢使用单个正则表达式:

      >> options.split /\s*, or\s+|\s*,\s*|\s+or\s+/
      => ["Cake", "pie", "ice cream", "pudding"]
      

      您可以在正则表达式中使用| 来提供替代方案,并将, or 放在首位可以保证它不会产生空项目。使用正则表达式捕获空白可能是提高效率的最佳选择,因为您不必再​​次扫描数组。

      正如 Zabba 指出的那样,您可能仍想拒绝空项目,提示此解决方案:

      >> options.split(/,|\sor\s/).map(&:strip).reject(&:empty?)
      => ["Cake", "pie", "ice cream", "pudding"]
      

      【讨论】:

      • 如果字符串以,or 开头,无论出于何种原因怎么办?然后,您的正则表达式将生成空白/空字符串。
      • 好吧,我们确实想把它当作一个分隔符。开头的分隔符表示一个空项目。但我会解决的。
      • 第二种解决方案存在一个问题,即类似“smore's”的词会产生["sm","e's"]。将正则表达式设为/,|\sor\s/ 可能会更好。 (并且可以选择使用 'i' 模式来接受大写的 ` OR `。)
      • 请注意"oranges" 不在您的列表中。您可能想从\s*or\s* 切换到\s*\bor\b\s*,例如:/\s*,\s*\bor\b\s*|\s*,\s*|\s*\bor\b\s*/
      猜你喜欢
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2012-12-27
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多