如何使用正则表达式捕获 'multiple' 个重复组
How to capture 'multiple' repeated groups with Regular Expressions
我有以下文本文件,我想对其进行解析以获取各个字段:
host_group_web = ( )
host_group_lbnorth = ( lba050 lbhou002 lblon003 )
我要提取的字段以粗体显示
- host_group_网络 = ( )
- host_group_lbnorth = ( lba505 lbhou002 lblon003)
host_group_web 在 ( ) 之间没有项目,因此该部分将被忽略
我将第一组命名为 nodegroup,将 () 之间的项目命名为 nodes
我正在逐行读取文件,并存储结果以供进一步处理。
在 Golang 中,这是我正在使用的 Regex 片段:
hostGroupLine := "host_group_lbnorth = ( lba050 lbhou002 lblon003 )"
hostGroupExp := regexp.MustCompile(`host_group_(?P<nodegroup>[[:alnum:]]+)\s*=\s*\(\s*(?P<nodes>[[:alnum:]]+\s*)`)
hostGroupMatch := hostGroupExp.FindStringSubmatch(hostGroupLine)
for i, name := range hostGroupExp.SubexpNames() {
if i != 0 {
fmt.Println("GroupName:", name, "GroupMatch:", hostGroupMatch[i])
}
}
我得到以下输出,缺少 nodes 命名组的其余匹配项。
GroupName: nodegroup GroupMatch: lbnorth
GroupName: nodes GroupMatch: lba050
The Snippet in Golang Playground
我的问题是,如何在 Golang 中获得匹配 nodegroup 和可能在行,例如 lba050 lbhou002 lblon003。
节点数量会有所不同,从 0 到一样多。
如果您想捕获组名和所有可能的节点名,您应该使用不同的正则表达式模式。这个应该一次捕获所有这些。不需要使用命名的捕获组,但如果你愿意,你可以。
hostGroupExp := regexp.MustCompile(`host_group_([[:alnum:]]+)|([[:alnum:]]+) `)
hostGroupLine := "host_group_lbnorth = ( lba050 lbhou002 lblon003 )"
hostGroupMatch := hostGroupExp.FindAllStringSubmatch(hostGroupLine, -1)
fmt.Printf("GroupName: %s\n", hostGroupMatch[0][1])
for i := 1; i < len(hostGroupMatch); i++ {
fmt.Printf(" Node: %s\n", hostGroupMatch[i][2])
}
中查看实际效果
选择:
您也可以按照 awk 进行解析的方式工作:使用正则表达式将行拆分为标记并打印您需要的标记。当然,行布局应该与您示例中给出的布局相同。
package main
import (
"fmt"
"regexp"
)
func printGroupName(tokens []string) {
fmt.Printf("GroupName: %s\n", tokens[2])
for i := 5; i < len(tokens)-1; i++ {
fmt.Printf(" Node: %s\n", tokens[i])
}
}
func main() {
// regexp line splitter (either _ or space)
r := regexp.MustCompile(`_| `)
// lines to parse
hostGroupLines := []string{
"host_group_lbnorth = ( lba050 lbhou002 lblon003 )",
"host_group_web = ( web44 web125 )",
"host_group_web = ( web44 )",
"host_group_lbnorth = ( )",
}
// split lines on regexp splitter and print result
for _, line := range hostGroupLines {
hostGroupMatch := r.Split(line, -1)
printGroupName(hostGroupMatch)
}
}
中查看实际效果
我有以下文本文件,我想对其进行解析以获取各个字段:
host_group_web = ( )
host_group_lbnorth = ( lba050 lbhou002 lblon003 )
我要提取的字段以粗体显示
- host_group_网络 = ( )
- host_group_lbnorth = ( lba505 lbhou002 lblon003)
host_group_web 在 ( ) 之间没有项目,因此该部分将被忽略
我将第一组命名为 nodegroup,将 () 之间的项目命名为 nodes
我正在逐行读取文件,并存储结果以供进一步处理。
在 Golang 中,这是我正在使用的 Regex 片段:
hostGroupLine := "host_group_lbnorth = ( lba050 lbhou002 lblon003 )"
hostGroupExp := regexp.MustCompile(`host_group_(?P<nodegroup>[[:alnum:]]+)\s*=\s*\(\s*(?P<nodes>[[:alnum:]]+\s*)`)
hostGroupMatch := hostGroupExp.FindStringSubmatch(hostGroupLine)
for i, name := range hostGroupExp.SubexpNames() {
if i != 0 {
fmt.Println("GroupName:", name, "GroupMatch:", hostGroupMatch[i])
}
}
我得到以下输出,缺少 nodes 命名组的其余匹配项。
GroupName: nodegroup GroupMatch: lbnorth
GroupName: nodes GroupMatch: lba050
The Snippet in Golang Playground
我的问题是,如何在 Golang 中获得匹配 nodegroup 和可能在行,例如 lba050 lbhou002 lblon003。 节点数量会有所不同,从 0 到一样多。
如果您想捕获组名和所有可能的节点名,您应该使用不同的正则表达式模式。这个应该一次捕获所有这些。不需要使用命名的捕获组,但如果你愿意,你可以。
hostGroupExp := regexp.MustCompile(`host_group_([[:alnum:]]+)|([[:alnum:]]+) `)
hostGroupLine := "host_group_lbnorth = ( lba050 lbhou002 lblon003 )"
hostGroupMatch := hostGroupExp.FindAllStringSubmatch(hostGroupLine, -1)
fmt.Printf("GroupName: %s\n", hostGroupMatch[0][1])
for i := 1; i < len(hostGroupMatch); i++ {
fmt.Printf(" Node: %s\n", hostGroupMatch[i][2])
}
中查看实际效果
选择:
您也可以按照 awk 进行解析的方式工作:使用正则表达式将行拆分为标记并打印您需要的标记。当然,行布局应该与您示例中给出的布局相同。
package main
import (
"fmt"
"regexp"
)
func printGroupName(tokens []string) {
fmt.Printf("GroupName: %s\n", tokens[2])
for i := 5; i < len(tokens)-1; i++ {
fmt.Printf(" Node: %s\n", tokens[i])
}
}
func main() {
// regexp line splitter (either _ or space)
r := regexp.MustCompile(`_| `)
// lines to parse
hostGroupLines := []string{
"host_group_lbnorth = ( lba050 lbhou002 lblon003 )",
"host_group_web = ( web44 web125 )",
"host_group_web = ( web44 )",
"host_group_lbnorth = ( )",
}
// split lines on regexp splitter and print result
for _, line := range hostGroupLines {
hostGroupMatch := r.Split(line, -1)
printGroupName(hostGroupMatch)
}
}
中查看实际效果