由多个分隔符拆分

时间:2016-05-10 08:27:26

标签: ruby regex string

我收到一个字符串,其中包含两种不同格式的数字:

"344, 345""334,433""345x532""432 345"

我需要使用split将它们分成两个单独的数字,然后使用Integer(num)转换它们。

到目前为止我尝试过:

nums.split(/[\s+,x]/) # split on one or more spaces, a comma or x

但是,测试时似乎不匹配多个空格。此外,它不允许上面显示的逗号版本中的空格("344, 345")。

如何匹配多个分隔符?

4 个答案:

答案 0 :(得分:3)

您在模式中使用了一个字符类,它只匹配一个字符。 'suppress_filters' => true匹配1个空格,或[\s+,x]+,。您打算使用x

然而,或许,仅仅(?:\s+|x)(一个或多个非数字字符)就足够了:

\D+

答案 1 :(得分:3)

R1 = Regexp.union([", ", ",", "x", " "])
  #=> /,\ |,|x|\ /
R2 = /\A\d+#{R1}\d+\z/
  #=> /\A\d+(?-mix:,\ |,|x|\ )\d+\z/

def split_it(s)
  return nil unless s =~ R2
  s.split(R1).map(&:to_i)
end

split_it("344, 345") #=> [344, 345] 
split_it("334,433")  #=> [334, 433] 
split_it("345x532")  #=> [345, 532] 
split_it("432 345")  #=> [432, 345] 
split_it("432&345")  #=> nil
split_it("x32 345")  #=> nil

答案 2 :(得分:2)

您的原始正则表达式可以通过微调来移动' +'字符类之外的符号:

"344 ,x  345".split(/[\s,x]+/).map(&:to_i) #==> [344,345]

如果这些示例实际上是您遇到的唯一格式,则效果会很好。但是,如果您必须更灵活并且在数字之间容纳未知的分隔符,那么您最好使用Wiktor给出的答案:

"344 ,x  345".split(/\D+/).map(&:to_i) #==> [344,345]

这两种情况都会从给定的输入中返回一个整数数组,但第二个例子更加健壮,一目了然更容易理解。

答案 3 :(得分:1)

  

在测试

时似乎不匹配多个空格

是的,角色类(方括号)并不像这样工作。您对类本身应用量词,而不是对其字符应用。您可以使用|运算符。像这样:

.split(%r[\s+|,\s*|x])