2015-04-02 91 views
0

我知道这里有很多问题要问为什么他们的正则表达式失败,但我无法专门看到Go/Golang。为什么我的正则表达式总是在Go中失败?

我有一个ID类型,这是一个字符串,其中加入了一些方法:type ID string和这个函数,如果ID有效,它应该返回一个bool。

我的有效性标准是:

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

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

但每次我跑我的验证功能时,它返回无论输入错误。具体来说,regexp.MatchString()函数返回false和nil。

以下是我的验证函数,即使当我将正则表达式更改为/.{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 
    } 
} 

是否与我使用该函数的方式有关?我很难过。

Note: .ToUpper()函数在那里,因为当我的ID生成时,它们只生成大写字母和0-9,但我想要“ABC”如果键入被视为“ABC”手动在以后的日期。

回答

4

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

/字符在某些语言(如JavaScript和Ruby)的创建regular expression literals时,因为\字符在正则表达式经常使用的使用,需要双倍于普通字符串时逃逸。这在某些语言中只是一种便利,但通常不是实际的正则表达式语法的一部分(尽管每种语言都有不同的处理正则表达式)。

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

因此,例如,查找的字符串\.hidden-file-009,你可以写表达为:

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

,或者更简单地说:

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

辉煌!谢谢,它现在完美。 – leylandski 2015-04-02 14:54:21

+0

我不得不等待'你可以在x分钟内接受这个消息',否则我会立刻离开。 – leylandski 2015-04-02 15:17:33

相关问题