我收到一个字符串,其中包含两种不同格式的数字:
"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"
)。
如何匹配多个分隔符?
答案 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])