regex - 为什么我的正则表达式在 Go 中总是失败?

标签 regex go

我知道这里有很多问题询问为什么他们的正则表达式失败,但我看不到任何专门针对 Go/Golang 的问题。

我有一个 ID 类型,它是一个带有一些方法的字符串:type ID string,如果 ID 有效,这个函数应该返回一个 bool 值。

我的有效性标准是:

  • 20 个字符。
  • 任何大写字母 A-Z。
  • 任何数字 0-9。

所以我在几个不同的在线工具上测试过的正则表达式是 /[A-Z0-9]{20}/

但每次我运行验证函数时,无论输入如何,它都会返回 false。具体来说,regexp.MatchString() 函数返回 false 和 nil。

下面是我的验证函数,匹配总是错误的,即使我将正则表达式更改为 /.{20}/ 应该匹配任何东西的 20。

func (this ID) validate() bool {

    regexString := "/[A-Z0-9]{" + strconv.Itoa(MAX_ID_LENGTH) + "}/"
    fmt.Println(regexString)

    thisStr := this.ToString()
    fmt.Println(thisStr)
    charCount := utf8.RuneCountInString(thisStr)
    fmt.Println(charCount)
    thisStr = strings.ToUpper(thisStr)
    fmt.Println(thisStr)
    match, err := regexp.MatchString(regexString, thisStr)
    fmt.Println(match, err)

    //Check string length is correct and matches regex.
    if charCount != MAX_ID_LENGTH || !match {
        return false
    } else {
        return true
    }
}

这与我使用该功能的方式有关吗?我很难过。

注意: .ToUpper() 函数在那里,因为当我生成 ID 时,它们只用大写字母和 0-9 生成,但我希望“abc”被视为“ABC”,如果以后手动输入的话。

最佳答案

Go 正则表达式不应该被 / 字符包围。删除那些,看看是否有效。

在创建regular expression literals 时,某些语言(例如javascript 和ruby)使用了/ 字符。因为 \ 字符在正则表达式中经常使用,并且在常规字符串中需要双重转义。它在某些语言中只是一种方便,但通常不是实际正则表达式语法的一部分(尽管每种语言处理正则表达式的方式略有不同)。

Go语言不支持regex literals,但是它有string literals的概念,这使得编写复杂的正则表达式变得更加容易。

因此,例如,要查找字符串 \.hidden-file-009,您可以将表达式写为:

"\\\\\\.[a-zA-Z0-9\\-_]*"

或者,更简单地说:

 `\\\.[a-zA-Z0-9\-_]*`

关于regex - 为什么我的正则表达式在 Go 中总是失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29415857/

相关文章:

docker - 转到 Docker 容器失败 : "Exit Code 1"

go - 持续时间的时间单位

unit-testing - 在 golang 模拟依赖项中对 http 处理程序进行单元测试

regex - 如何编写以特定单词匹配开头并一直持续到遇到句点的正则表达式

regex - 使用ansible和regex_replace过滤器提取字符串的最后一个字符

regex - 不允许零的正则表达式

go - 如何关闭或清理标准输出管道?

regex - 匹配除电子邮件地址之外的所有内容的正则表达式

regex - Bash 字符串比较/前导零

json - 将字符串数组序列化为json