正則中有分組這個功能,在golang中也可以使用命名分組。
場景還原如下:
有一行文字,格式為:姓名 年齡 郵箱位址
請將其轉換為乙個map
**實現如下:
str := `alice 20 [email protected]`
// 使用命名分組,顯得更清晰
re := regexp.mustcompile(`(?p[a-za-z]+)\s+(?p\d+)\s+(?p\w+@\w+(?:\.\w+)+)`)
match := re.findstringsubmatch(str)
groupnames := pdpjqfxzqre.subexpnames()
fmt.printf("%v, %v, %d, %d\n", match, groupnames, len(match), len(groupnames))
result := make(map[string]string)
// 轉換為map
for i, name := range groupnames
}prettyresult, _ := json.marshalindent(result, "", " ")
fmt.printf("%s\n", prettyresult)
輸出為:
[alice 20 [email protected] alice 20 [email protected]], [ name age email], 4, 4
注意 [ name age email]有4個元素, 第乙個為""。
接上面的例子,實現乙個更貼近現實的需求:
有乙個檔案, 內容大致如下:
alice 20 [email protected]
bob 25 [email protected]
gerrylon 26 [email protected]
...更多內容
和上面一樣, 不過這次轉出來是乙個slice of map, 也就是多個map。
**如下:
// 檔案內容直接用字串表示
usersstr := `
alice 20 [email protected]
bob 25 [email protected]
gerrylon 26 [email protected]
`userre := regexp.mustcompile(`(?p[a-za-z]+)\s+(?p\d+)\s+(?p\w+@\w+(?:\.\w+)+)`)
// 這裡要用findallstringsubmatch,找到所有的匹配
users := userre.findallstringsubmatch(usersstr, -1)
groupnames := userre.subexpnames()
var result map[string]string // slice of map
// 迴圈所有行
for _, user := range users
}result = append(result, m)
}prettyresult, _ := json.marshalindent(result, "", " ")
fmt.println(string(prettyresult))
輸出為:
[, ,
]使用命名分組可以使正則表示的意義更清晰。
轉換為map更加符程式設計客棧合人類的閱讀習慣,不過比一般的根據索引取分組值麻煩一些。
補充:golang 正則分組匹配多個值
import (
"encoding/json"
"fmt"
"regexp"
)str := `9x_xx:995:88` // `9x_xx:995`
// 使用命名分組,一次匹配多個值
re := regexp.mustcompile(`(?p\w+):+(?p[1-9]*):*(?p[0-9]*)`)
match := re.findstringsubmatch(str)
groupnames := re.subexpnames()
fmt.printf("%v, %v, %d, %d\n", match, groupnames, len(match), len(groupnames))
result := make(map[string]string)
if len(match) == len(groupnames) }}
prettyresult, _ := json.marshalindent(result, "", " ")
fmt.printf("%s\n", prettyresult)
本文標題: golang正則之命名分組方式
本文位址:
golang正則之命名分組
正則中有分組這個功能,在golang中也可以使用命名分組。場景還原如下 實現如下 str alice 20 alice gmail.com 使用命名分組,顯得更清晰 re regexp.mustcompile p a za z s p d s p w w w match re.findstrings...
正規表示式中命名分組
命名分組 與普通分組一樣的功能,並且將匹配的子字串捕獲到乙個組名稱或編號名稱中。在獲得匹配結果時,可通過分組名進行獲取。說明命名捕獲根據左括號的從左到右的順序按順序編號 與非命名捕獲類似 但在對所有非命名捕獲進行計數之後才開始對命名捕獲進行編號。deelx 允許多個命名分組的名字相同,這時它們捕獲到...
JS 正則中的命名捕獲分組
假設你在一段陌生的 中看到這樣乙個函式 function tolocaldate date d d 2 1 3 單看這個函式你能知道它是想把 日 月 年 替換成 月 日 年 還是反過來?匿名捕獲分組沒法做到這一點,那就該命名捕獲分組上場了 function tolocaldate date d d ...