2016-05-10 29 views
3

我收到一个包含不同格式屈指可数两个数字的字符串:拆分多个定界符

"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")。

如何匹配多个分隔符?

+2

如果你的字符串不包含浮点数,你可以使用'nums.split(/ \ D + /)' –

回答

3

您在模式中使用了一个字符类,它只匹配一个字符。 [\s+,x]匹配1个空格,或+,,x。你打算使用(?:\s+|x)

不过,也许,仅仅\D+(1个或多个非数字字符)应该足够了:

"345, 456".split(/\D+/).map(&:to_i) 
+0

参见[IDEONE demo](http://ideone.com/5FQQhT)。 –

+0

谢谢!只是好奇,我需要多少额外的小数匹配? –

+1

如果字符串是预先验证的(只包含小数点,逗号(or-x)分隔,您可以使用['/[^\d.]+/'](http://ideone.com/HhLZnc)( '“345.56,456.466”.split(/ [^ \ d。] + /)。map(&:to_f)')。你也可以尝试一种更常见的*匹配技巧:['“345.56,456.466” (/[+-]?\d*\.?\d+/).map(&:to_f)'](http://ideone.com/cN3hUH) –

1

它似乎并不匹配的多个空格进行测试时

呀,字符类(方括号)不会像这样工作。你将量词应用于类本身,而不是字符。您可以使用|运算符。事情是这样的:

.split(%r[\s+|,\s*|x]) 
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

你原来的正则表达式将出现轻微的调整工作,以移动“+”符号的字符类之外:

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

如果例子实际上是唯一的格式你会遇到,这会很好。但是,如果你必须要更加灵活,适应数字之间未知分隔符,你就要去与Wiktor的给出了答案更好:

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

两种情况将返回从给定输入整数数组,但是第二个例子更加强大,一眼就能更容易理解。