2015-04-02 89 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

相關問題