正则表达式-解析正则表达式时出错:无效的转义序列:\\ K

我正在尝试编译一个正则表达式,以便可以使用Go从字符串中提取8位数字,其中数字之间有/无空格。由于某些原因,编译失败。我应该用什么代替K?

validAcc, err := regexp.Compile(`[ ]\K(?<!\d )(?=(?: ?\d){8})(?!(?: ?\d){9})\d[ \d]+\d`)
if err != nil {
    return
}

在这里播放

带有示例数据的更多代码

package main

import "strings"
import "regexp"
import "fmt"

func main() {

    msg := ` 12 34 56 78 //the number we need
 12 3455678 90123455 // the number we don't need`

    acc, err := accFromText(msg)
    if err != nil {
        panic(err)
    }
    exAcc := "12345678"
    if acc != exAcc {
        fmt.Printf("expected %v, received %v", exAcc, acc)
    }

    msg = `
More details here
1234567 12345 123456789 asd
12000000000 a number we don't need 
 12 3456 78 //this is the kind of number we need
 12 3455678 90123455 // the number we don't need`

    acc, err = accFromText(msg)
    if err != nil {
        panic(err)
    }
    exAcc = "12345678"
    if acc != exAcc {
        fmt.Printf("expected %v, received %v", exAcc, acc)
    }

}

func accFromText(msg string) (accNumber string, err error) {
    validAcc, err := regexp.Compile(`[ ]\K(?<!\d )(?=(?: ?\d){8})(?!(?: ?\d){9})\d[ \d]+\d`)
    if err != nil {
        return
    }
    accNumber = string(validAcc.Find([]byte(msg)))
    accNumber = strings.Replace(accNumber, " ", "", -1)
    return
}

考虑到go regexp r2不支持任何向前/向后搜索,您可以先尝试使用一个更简单的表达式吗:

c, err := regexp.Compile(`\b\d{8}\b`)

以您的情况(操场),这将工作

(\d\d ){4}
validAcc, err := regexp.Compile(`(\d\d ){4}`)

要么:

(\d\d ?){4} # matches '33 1133 06 Oth'
validAcc, err := regexp.Compile(`(\d\d ?){4}`)

再次,我先尝试一个简单的正则表达式,然后再尝试更复杂的选项:它将取决于您必须解析的数据。


对于更复杂的情况,单独的正则表达式可以帮助您捕获组中的数据,然后您需要提取找到的数字(这意味着您需要将后处理添加到正则表达式中):

validAcc, err := regexp.Compile(`[^\d]((\d\d ?){4})[^\d]`)
if err != nil {
    return
}
accNumber = string(validAcc.Find([]byte(msg)))[1:]
accNumber = accNumber[:len(accNumber)-1]
accNumber = strings.Replace(accNumber, " ", "", -1)

参观游乐场

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章