2016-08-23 1293 views
0

在正則表達式中,我無法解決(在golang中)如何匹配字符,分隔符或字符串尾部。下面幾乎做什麼,我想:如何匹配golang正則表達式中的字符或字符串結尾?

url := "test20160101" 
if i, _ := regexp.MatchString("[-a-zA-Z/]20[012]\\d[01]\\d[0123]\\d[-a-zA-Z/]", url); i == true { 
    t := regexp.MustCompile("[-a-zA-Z/](20[012]\\d[01]\\d[0123]\\d)[-a-zA-Z/]").FindStringSubmatch(url)[1] 
    fmt.Println("match: ", t) 
} 

https://play.golang.org/p/eWZ_DiOVBl

但我想也符合以下:

url := "test-20160101-" 
url := "/20160101/page.html" 

我注意到有在the golang documentation一個\ž但這並不工作,至少當我把它放在裏面[-a-zA-Z/][-a-zA-Z\\z/]

+1

只是關於正則表達式編譯的一個注意事項,以防您習慣於像在問題中那樣編寫它。正則表達式編譯*是昂貴的*。做一次並存儲結果。最近看到了一些代碼在循環中執行了MustCompile。這是一個非常緩慢的錯誤。 –

+0

是的,你不應該把'\ z'放在字符類中。它會匹配那裏的文字「z」。 – Bergi

+0

@ZanLynx好的指針。它只是我的測試代碼,但我們不希望人們效仿它。 – Jacob

回答

1

我很感興趣,只是爲了好玩而玩。也許是這樣的:https://play.golang.org/p/GRVnHTwW0g

package main 

import (
    "fmt" 
    "regexp" 
) 

func main() { 

    // Want to match "test-20160101", "/20160101/" and "test-20160101" 

    re := regexp.MustCompile(`[-a-zA-Z/](20[012]\d[01]\d[0123]\d)([-a-zA-Z/]|\z)`) 
    urls := []string{ 
     "test-20160101", 
     "/20160101/page.html", 
     "test20160101", 
     "nomatch", 
     "test19990101", 
    } 

    for _, url := range urls { 
     t := re.FindStringSubmatch(url) 
     if len(t) > 2 { 
      fmt.Println("match", url, "=", t[1]) 
     } 
    } 
} 
+0

挽救生命。這完美地解決了它。我會修改你的帖子,以澄清可能會有更多的網址結束 – Jacob

2

?放在e nd的模式。這意味着前面的項目是可選的。

如果要將模式錨定在匹配字符串的末尾,請在最後(在?之後)輸入$(或\z)。

此外,你應該使用backquotes而不是雙引號引起你的RE。這樣你就不必逃避反斜槓。

而@贊恩山貓提到,只編譯一次RE。

+0

有用的回覆,但是可能有更多的字符串,否則我會做到這一點。我會更新這個問題來澄清這一點。 – Jacob

相關問題