如何在正则表达式中匹配这些字符串变体?

问题描述 投票:0回答:1

问题非常简单,我想在Go中使用正则表达式编译器处理一个字符串,并将其分成三个子字符串,我已经有了一些可以工作的东西,但遗憾的是它有一些缺点,这是我的正则表达式

str := "ARM64x99Bar"
pattern := `^(?!^\d+$)[a-zA-Z0-9]+(\d+)(.*)$`

r := regexp.MustCompile(pattern)
matches := r.FindStringSubmatch(str)

例如,

Foo9Bar
可以工作,我可以获得三个所需的子字符串
Foo, 9, Bar
,但是如果有两位数,则会中断,例如,
Foo99Bar
返回,
Foo9, 9, Bar
,首先,我该如何改进?

其次,当字符串是

ARM64x99Bar
时,情况会变得复杂,在这种情况下,我也想获得
ARM64x, 99, Bar

因此,总而言之,第一个子字符串组可以是字母数字或单词,但可以从不从数字开始,第二个子字符串组将始终是数字(一个或多个数字,最多两位数)如 9 或 99),并且第三个子字符串组将始终仅是英文字母。

regex go regex-lookarounds regex-group regex-greedy
1个回答
0
投票

首先在术语之间插入一些逗号,然后拆分:

str := "ARM64x99Bar" pattern := `([a-zA-Z])(\d)|(\d)([a-zA-Z])` r := regexp.MustCompile(pattern) str = r.ReplaceAllString(str, `$1$3,$2$4`) str = r.ReplaceAllString(str, `$1$3,$2$4`) matches := strings.Split(str, `,`) fmt.Println(matches)
参见

现场演示

要仅在

大写 字母和数字之间进行拆分,请从正则表达式中删除小写字母:

pattern := `([A-Z])(\d)|(\d)([A-Z])`
请注意,由于 golang 缺乏环视支持,因此您必须执行替换

两次,以防需要在下一场比赛开始时结束比赛。

© www.soinside.com 2019 - 2024. All rights reserved.