Go语言中匹配字符串内仅连续两位数字的正则表达式方案
Go语言匹配孤立的连续两位数字子串
要筛选出字符串中仅由连续两位数字组成的子串(即该子串前后不能是数字),由于Go标准库正则不支持环视语法,可以用以下两种方案解决:
方案一:带捕获组的正则匹配
直接构造正则,匹配"前后为非数字/字符串首尾 + 两位数字"的组合,通过捕获组提取目标子串:
package main import ( "fmt" "regexp" ) func main() { // 正则说明: // (?:^|[^\d]):匹配字符串开头,或非数字字符(非捕获组) // (\d{2}):捕获连续两位数字(目标子串) // (?:[^\d]|$):匹配非数字字符,或字符串结尾(非捕获组) reg := regexp.MustCompile(`(?:^|[^\d])(\d{2})(?:[^\d]|$)`) input := "123j3d7djabsd87hbdsak27dbjsak374jdscu2kd389jd34" // 提取所有捕获组的结果 matches := reg.FindAllStringSubmatch(input, -1) for _, m := range matches { fmt.Println("匹配结果:", m[1]) } }
方案二:先匹配再验证
先找出所有两位数字子串,再通过索引检查子串前后是否为数字,过滤不符合条件的结果:
package main import ( "fmt" "regexp" "unicode" ) func main() { reg := regexp.MustCompile(`\d{2}`) input := "123j3d7djabsd87hbdsak27dbjsak374jdscu2kd389jd34" // 获取所有两位数字子串的起止索引 matchIndices := reg.FindAllStringIndex(input, -1) for _, idx := range matchIndices { start, end := idx[0], idx[1] // 检查前一个字符是否不是数字(或处于字符串开头) validPrev := start == 0 || !unicode.IsDigit(rune(input[start-1])) // 检查后一个字符是否不是数字(或处于字符串结尾) validNext := end == len(input) || !unicode.IsDigit(rune(input[end])) if validPrev && validNext { fmt.Println("匹配结果:", input[start:end]) } } }
两种方案对示例输入的输出均为:
匹配结果: 87 匹配结果: 27 匹配结果: 34
内容的提问来源于stack exchange,提问作者winnnd
相关产品推荐
相关产品推荐

