举个例子,我有一个像这样的字符串:
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"]
是否有更高效(或更简单)的方法将我的字符串拆分为这三个分隔符?
答案 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)