将字符串拆分为字符串和整数

时间:2015-03-18 10:35:34

标签: ruby regex string string-split

我有几个包含一个或多个数字的字符串,也可能在数字后面包含一个或多个字母(字母上限无关紧要)。字符串遵循以下正则表达式模式:

[0-9]+[a-zA-z]*

可能看起来像:

"15791"
"14810A"
"10480ABCD"
"5ABCDEFGH"

如果上面的一个字符串包含非数字字符,如何将数字(第一部分)拆分为整数,将字母(第二部分)拆分为字符串?

我知道我可以拆分这样的字符串:

array = "1,2,3,4".split(',')

但这没有用,因为我没有分隔符。

4 个答案:

答案 0 :(得分:9)

string.split中使用基于正向lookbehind断言的正则表达式。

> "10480ABCD".split(/(?<=\d)(?=[A-Za-z])/)
=> ["10480", "ABCD"]
  • (?<=\d)肯定的外观,断言匹配必须以数字字符开头。

  • (?=[A-Za-z])断言匹配必须后跟字母表。因此,上述正则表达式将匹配数字和字母之间存在的边界。根据匹配的边界拆分输入将为您提供所需的输出。

使用string.scan

> "10480ABCD".scan(/\d+|[A-Za-z]+/)
=> ["10480", "ABCD"]

答案 1 :(得分:6)

分割器本身就是非数字字符:

"10480ABCD".split(/(\D+)/)
# => ["10480", "ABCD"]

答案 2 :(得分:0)

您始终可以使用match

re = /(\d+)([a-z]*)/i
str = "10480ABCD"

m = re.match(str)
m    #=> #<MatchData "10480ABCD" 1:"10480" 2:"ABCD">
m[0] #=> "10480"
m[1] #=> "ABCD"

使用MatchData#[]提取捕获组:

re.match(str)[1, 2]
["10480", "ABCD"]

答案 3 :(得分:0)

[编辑:出于某种原因@Humza删除了他的答案,所以我已经取消了我的答案。我以前发过这个,但是当我注意到Humza已经发布了类似的答案时,我就将其删除了。]

我觉得我必须遗漏一些东西,因为它似乎有一个直截了当的解决方案:

def extract(str)
  str.scan(/\d+|[A-Z]+/i)
end

extract "15791"     #=> ["15791"] 
extract "14810A"    #=> ["14810", "A"] 
extract "10480ABCD" #=> ["10480", "ABCD"]
extract "5ABCDEFGH" #=> ["5", "ABCDEFGH"]