2017-07-27 84 views
1

我使用go 1.8.3和I想使用正則表達式包從"1234abcd"得到"123"。當我使用regexp.Compile("^123(?:4)")時,它來到"1234"我使用regexp.Compile(`^ 123(?:4)`)嘗試從「1234abcd」中獲得「123」,而它出現爲「1234」

編碼在此:https://play.golang.org/p/jB7FmxWz9r

package main 

import (
    "regexp" 
    "fmt" 
) 

func main() { 
    test, err := regexp.Compile(`^123(?:4)`) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 
    input := "1234|wserw" 
    fmt.Println(test.FindString(input)) 
} 

出來:1234

預期:123根據

回答

2

https://groups.google.com/forum/#!topic/golang-nuts/8Xmvar_ptcU

捕獲組是()被記錄在索引匹配列表中,wha其他語言可能會調用$ 1,$ 2,$ 3等。非捕獲組是一種使用()而不使用其中一個數字的方法。一個組是否捕捉對整個表達式匹配的完整字符串沒有影響。這裏匹配的完整字符串是「datid = 12345」,這就是FindString返回的內容。

您使用非捕獲組的原因與您在算術表達式(x + y)* z中使用圓括號的原因相同:覆蓋默認的運算符優先級。在這裏有或沒有組的優先順序是相同的。換句話說,(?:datid =)[0-9] {5}與datid = [0-9] {5}完全相同的正則表達式。

因此,行爲是由golang的開發人員設計的。

的解決方法是使用regexp.Compile(`^(123)(?:4)`),並使用FindStringSubmatch

+0

感謝您的回答捕捉到它,但是當我使用regexp.Compile(\'^ 1234(?:\\ |)\'),它出來是「1234」而沒有「|」從「1234 | abcd」,那麼有什麼區別? – yingqin

+0

是這樣的:https://play.golang.org/p/0kVDUx1gOw – yingqin

+1

@yingqin \\匹配一個組中的\和'|'會做一個正則表達式OR。所以這個'(?:\\ |)'會匹配\或空字符串。這個'(?:\ |)'完全匹配一個'|'管道符號。 –

相關問題