在Ruby中拆分带有多个分隔符的字符串

Mar*_*ark 11 ruby string delimiter

举个例子,我有一个像这样的字符串:

options = "Cake or pie, ice cream, or pudding"
Run Code Online (Sandbox Code Playgroud)

我希望能够通过分割字符串or,,, or.

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

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

结果数组是这样的: ["Cake", "pie", "ice cream", "pudding"]

是否有更高效(或更简单)的方法将我的字符串拆分为这三个分隔符?

mab*_*ako 15

以下内容如何:

options.gsub(/ or /i, ",").split(",").map(&:strip).reject(&:empty?)
Run Code Online (Sandbox Code Playgroud)
  • 取代所有分隔符但是 ,
  • 将它拆分为 ,
  • 修剪每个角色,因为 ice cream可能会留下像领先空间这样的东西
  • 删除所有空白字符串

  • 看起来更容易阅读,虽然有两件事:一,`&:empty`应改为`&:empty?`,两,``或"`可以改为`/或/ i`以适应大写'OR'也是如此. (2认同)

Jos*_*Lee 9

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

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

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

>> options.split /\s*, or\s+|\s*,\s*|\s+or\s+/
=> ["Cake", "pie", "ice cream", "pudding"]
Run Code Online (Sandbox Code Playgroud)

您可以|在正则表达式中使用它来提供替代方案,并, or首先保证它不会产生空项.使用正则表达式捕获空白可能最有效,因为您不必再​​次扫描数组.

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

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

  • 好吧,我们确实希望将其视为分隔符.开头的分隔符表示空项.但我会解决它. (2认同)
  • 最好小心``oranges``不在你的清单中.您可能希望从`\ s*或\ s*`切换到`\ s*\bor\b\s*`喜欢:`/\s*,\ s*\bor\b\s*|\s*,\ S*|\s*\博尔\ b\S*/` (2认同)