将一个字符串拆分为一个字符串和一个整数
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"]
我有几个包含一位或多位数字的字符串,并且还可能在数字后面包含一个或多个字母(字母大写无关紧要)。字符串遵循以下正则表达式模式:
[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"]