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

时间:2011-06-01 20:34:13

标签: ruby string delimiter

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

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"]

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

3 个答案:

答案 0 :(得分:15)

以下内容如何:

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

答案 1 :(得分:9)

首先,您可以使用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"]

答案 2 :(得分:3)

由于"or"","执行相同的操作,最好的方法是告诉正则表达式应该将多个案例视为单个案例:

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