簡體   English   中英

由多個分隔符拆分

[英]Split by multiple delimiters

我收到一個字符串,其中包含兩種不同格式的數字:

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

我需要把它們分為兩個單獨的號碼在使用陣列split ,然后使用它們轉換Integer(num)

到目前為止我嘗試過的:

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

但是,測試時似乎不匹配多個空格。 此外,它不允許上面顯示的逗號版本中的空格( "344, 345" )。

如何匹配多個分隔符?

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

但是,或許,僅僅\\D+ (1個或更多非數字字符)就足夠了:

"345, 456".split(/\D+/).map(&:to_i)
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

你的原始正則表達式可以通過一個小調整來移動字符類之外的'+'符號:

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

如果這些示例實際上是您將遇到的唯一格式,那么這將很有效。 但是,如果您必須更靈活並且在數字之間容納未知的分隔符,那么您最好使用Wiktor給出的答案:

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

兩種情況都會從給定的輸入返回一個整數數組,但第二個例子更加健壯,一目了然更容易理解。

它在測試時似乎不匹配多個空格

是的,字符類(方括號)不能像這樣工作。 您對類本身應用量詞,而不是對其字符應用。 你可以使用| 而不是運營商 像這樣的東西:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM