我有几个包含一个或多个数字的字符串,也可能在数字后面包含一个或多个字母(字母上限无关紧要)。字符串遵循以下正则表达式模式:
[0-9]+[a-zA-z]*
可能看起来像:
"15791"
"14810A"
"10480ABCD"
"5ABCDEFGH"
如果上面的一个字符串包含非数字字符,如何将数字(第一部分)拆分为整数,将字母(第二部分)拆分为字符串?
我知道我可以拆分这样的字符串:
array = "1,2,3,4".split(',')
但这没有用,因为我没有分隔符。
答案 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"]