多个分隔符分割字符串

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+/) - Wiktor Stribiżew
4个回答

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

然而,也许仅使用\D+(1个或多个非数字字符)就足够了:

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

谢谢!只是好奇,如果要匹配小数点后的数字,我需要什么额外的东西? - user5786934
1
如果字符串已经过预验证(仅包含十进制数字、逗号或破折号分隔),您可以使用/[^\d.]+/ ("345.56, 456.466".split(/[^\d.]+/).map(&:to_f))。您还可以尝试更常见的匹配技术:"345.56, 456.466".scan(/[+-]?\d*\.?\d+/).map(&:to_f) - Wiktor Stribiżew

2
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]

两种情况都将返回给定输入的整数数组,但第二个示例更加健壮且一目了然。


0

在测试时,它似乎无法匹配多个空格。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接