问题非常简单,我想在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),并且第三个子字符串组将始终仅是英文字母。
首先在术语之间插入一些逗号,然后拆分:
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 缺乏环视支持,因此您必须执行替换两次,以防需要在下一场比赛开始时结束比赛。