更新时间:2022-11-14 21:16:53
如果要捕获组名和所有可能的节点名,则应使用其他正则表达式模式.这个应该一口气捕获所有的对象.无需使用命名的捕获组,但如果需要,可以.
If you want to capture the group name and all possible node names, you should work with a different regex pattern. This one should capture all of them in one go. No need to work with named capture groups but you can if you want to.
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 的方式进行工作:使用regexp表达式将行拆分为标记并打印所需的标记.当然,行的布局应与示例中的行布局相同.
You can also work the way awk would do the parsing: use a regexp expression to split the lines in tokens and print the tokens you need. Of course the line layout should be the same as the one given in your example.
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)
}
}
在游乐场