2016-05-10 52 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] 

兩種情況將返回從給定輸入整數數組,但是第二個例子更加強大,一眼就能更容易理解。