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

Split a string into a string and an integer

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

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

可能看起来像:

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

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

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

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

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

string.split.

中使用基于正则表达式的正后向断言
> "10480ABCD".split(/(?<=\d)(?=[A-Za-z])/)
=> ["10480", "ABCD"]
  • (?<=\d) 断言匹配项前面必须有数字字符的正后视。

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

使用string.scan

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

您可以随时使用 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"]

拆分器是非数字字符本身:

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

[编辑:出于某种原因@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"]