网络编程
位置:首页>> 网络编程>> Go语言>> golang正则之命名分组方式

golang正则之命名分组方式

作者:butterfly5211314  发布时间:2024-05-22 10:17:10 

标签:golang,正则,命名分组

正则中有分组这个功能,在golang中也可以使用命名分组。

一次匹配的情况

场景还原如下:

有一行文本,格式为:姓名 年龄 邮箱地址

请将其转换为一个map

代码实现如下:


str := `Alice 20 alice@gmail.com`
// 使用命名分组,显得更清晰
re := regexp.MustCompile(`(?P<name>[a-zA-Z]+)\s+(?P<age>\d+)\s+(?P<email>\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 {
   if i != 0 && name != "" { // 第一个分组为空(也就是整个匹配)
       result[name] = match[i]
   }
}
prettyResult, _ := json.MarshalIndent(result, "", "  ")
fmt.Printf("%s\n", prettyResult)

输出为:


[Alice 20 alice@gmail.com Alice 20 alice@gmail.com], [ name age email], 4, 4
{
 "age": "20",
 "email": "alice@gmail.com",
 "name": "Alice"
}

注意 [ name age email]有4个元素, 第一个为""。

多次匹配的情况

接上面的例子,实现一个更贴近现实的需求:

有一个文件, 内容大致如下:


Alice 20 alice@gmail.com
Bob 25 bob@outlook.com
gerrylon 26 gerrylon@github.com
...
更多内容

和上面一样, 不过这次转出来是一个slice of map, 也就是多个map。

代码如下:


// 文件内容直接用字符串表示
usersStr := `
   Alice 20 alice@gmail.com
   Bob 25 bob@outlook.com
   gerrylon 26 gerrylon@github.com
`
userRe := regexp.MustCompile(`(?P<name>[a-zA-Z]+)\s+(?P<age>\d+)\s+(?P<email>\w+@\w+(?:\.\w+)+)`)
// 这里要用FindAllStringSubmatch,找到所有的匹配
users := userRe.FindAllStringSubmatch(usersStr, -1)
groupNames := userRe.SubexpNames()
var result []map[string]string // slice of map
// 循环所有行
for _, user := range users {
   m := make(map[string]string)
   // 对每一行生成一个map
   for j, name := range groupNames {
       if j != 0 && name != "" {
           m[name] = strings.TrimSpace(user[j])
       }
   }
   result = append(result, m)
}
prettyResult, _ := json.MarshalIndent(result, "", "  ")
fmt.Println(string(prettyResult))

输出为:


[
 {
   "age": "20",
   "email": "alice@gmail.com",
   "name": "Alice"
 },
 {
   "age": "25",
   "email": "bob@outlook.com",
   "name": "Bob"
 },
 {
   "age": "26",
   "email": "gerrylon@github.com",
   "name": "gerrylon"
 }
]

来源:https://gerrylon.blog.csdn.net/article/details/82532970

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com