You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:02:29