正則中有分組這個功能,在golang中也可以使用命名分組。
場景還原如下:
**實現如下:
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 := re.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
}}prettyresult, _ := json.marshalindent(result, "", " ")
fmt.println(string(prettyresult))
[
, ,
]
參考:
歡迎補充指正!
golang正則之命名分組方式
正則中有分組這個功能,在golang中也可以使用命名分組。場景還原如下 有一行文字,格式為 姓名 年齡 郵箱位址 請將其轉換為乙個map 實現如下 str alice 20 alice gmail.com 使用命名分組,顯得更清晰 re regexp.mustcompile p a za z s p...
正規表示式中命名分組
命名分組 與普通分組一樣的功能,並且將匹配的子字串捕獲到乙個組名稱或編號名稱中。在獲得匹配結果時,可通過分組名進行獲取。說明命名捕獲根據左括號的從左到右的順序按順序編號 與非命名捕獲類似 但在對所有非命名捕獲進行計數之後才開始對命名捕獲進行編號。deelx 允許多個命名分組的名字相同,這時它們捕獲到...
JS 正則中的命名捕獲分組
假設你在一段陌生的 中看到這樣乙個函式 function tolocaldate date d d 2 1 3 單看這個函式你能知道它是想把 日 月 年 替換成 月 日 年 還是反過來?匿名捕獲分組沒法做到這一點,那就該命名捕獲分組上場了 function tolocaldate date d d ...