2016-01-08 115 views
3

我讀了golang.org website的示例代碼。本質上,代碼如下所示:前往ReplaceAllString

re := regexp.MustCompile("a(x*)b") 
fmt.Println(re.ReplaceAllString("-ab-axxb-", "T")) 
fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1")) 
fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1W")) 
fmt.Println(re.ReplaceAllString("-ab-axxb-", "${1}W")) 

輸出是這樣的:

-T-T- 
--xx- 
--- 
-W-xxW- 

我理解的第一輸出,但我不明白的其餘3個。有人可以向我解釋結果2,3和4.謝謝。

+0

您是否閱讀過示例代碼上方的文本? – ruakh

+0

是的,我讀過。但我仍不明白擴張如何運作。 –

回答

2

最吸引人的是fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1W"))一行。該docs say

裏面REPL,$跡象解釋爲Expand

而且Expand說:

在模板中,一個變量由形式$name的一個子表示或${name},其中name是字母,數字和下劃線的非空序列。 對超出範圍或不匹配的索引或正則表達式中不存在的名稱的引用被空片段替換。

$name形式,名稱取爲儘可能長:$1x相當於${1x},不${1}x,並且,$10相當於${10},不${1}0

所以,在第三替換,$1W被視爲${1W}和因爲該組沒有初始化,一個空字符串用於替換。

當我說「該組未被初始化」時,我的意思是說該組未在正則表達式模式中定義,因此在匹配操作期間未填充該組。 替換表示獲取所有匹配項,然後用替換模式替換它們。 反向引用$xx構造)在匹配階段期間填充。該模式中缺少$1W組,因此,它在匹配期間未填充,只有在使用替換階段時纔會使用空字符串。

第二個和第四個替換很容易理解,並已在上面的答案中描述。只是$1反向引用捕獲與第一捕獲組(封閉具有一對未轉義括號的子模式),同樣是用實施例中的字符4.

你能想到的{}作爲一種手段來消除歧義更換模式。現在

,如果你需要做的結果是一致的,使用命名捕獲(?P<1W>....)

re := regexp.MustCompile("a(?P<1W>x*)b") // <= See here, pattern updated 
fmt.Println(re.ReplaceAllString("-ab-axxb-", "T")) 
fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1")) 
fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1W")) 
fmt.Println(re.ReplaceAllString("-ab-axxb-", "${1}W")) 

結果:

-T-T- 
--xx- 
--xx- 
-W-xxW- 

第2和第3行現在產生一致的輸出,因爲指定組1W也是第一組組,$1編號的反向參考點以與命名捕獲$1W捕獲相同的文本。

+0

「這個組未初始化」是什麼意思?如何初始化一個組?對不起,我的問題可能是天真的。 –

+0

該組未在正則表達式模式中指定,因此在匹配操作期間未填充*。替換意味着獲得所有匹配,然後用替換模式替換它們。 *反向引用*('$ xx'構造)在*匹配*階段被填充。 $ 1W'組在模式中缺失,因此它在匹配過程中未被填充,並且在替換階段發生時僅使用空字符串。 –

+0

如果我需要,應該做些什麼來使價值1W的禮物?我正在嘗試接受有關指定組的教育。 –

1

$數或$名稱是在正則表達式或子組名稱子組的索引

fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1")) 

$ 1是正則表達式亞組1 = x*

fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1W")) 

$ 1W無子組名稱1W =>全部替換與空

fmt.Println(re.ReplaceAllString("-ab-axxb-", "${1}W")) 

$ 1和$ {1}是相同的。爲W

替換所有亞組1的詳細資料:https://golang.org/pkg/regexp/

+0

謝謝。你能解釋第二個結果嗎? –

+0

好的,$名稱後的所有字符是名稱,所以沒有替換鍵=>替換鍵= null,如果找不到組名,它將使用默認正則表達式a(x *)b並用空值替換 – trquoccuong

+0

謝謝讓我瞭解這個指定的羣體。 –

0

$1${1}

${1}的簡寫是第一個(1)基團,例如的值第一對()的內容。該組是(x*),即任何數量的x

ReplaceAllString取代每一個匹配。有兩場比賽。第一個是ab,第二個是axxb

否2.用組內容替換任何匹配:第一個匹配是「」,第二個匹配是「xx」。

否4.在組內容後添加「W」。

否3.留作練習。提示:第十二個捕獲組將是12美元。

+0

因此,我可以理解,替換對每場比賽都是動態的嗎? –

+0

謝謝。你的回答幫助我理解了第二個輸出。 –

+0

我們不是在寫一本數學書籍,而是把東西留作練習。 – snorberhuis