使用golang的正则表达式命名组

问题描述 投票:0回答:1

我需要将正则表达式与golang集成的帮助。我想解析日志文件并创建一个正则表达式,在https://regex101.com/r/p4mbiS/1/

上看起来还不错

日志行看起来像这样:

57.157.87.86 - - [06/Feb/2020:00:11:04 +0100] "GET /?parammore=1&customer_id=1&version=1.56&param=meaningful&customer_name=somewebsite.de&some_id=4&cachebuster=1580944263903 HTTP/1.1" 204 0 "https://www.somewebsite.com/more/andheresomemore/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0"

这样的正则表达式:

(?P<ip>([^\s]+)).+?\[(?P<localtime>(.*?))\].+?GET\s\/\?(?P<request>.+?)\".+?\"(?P<ref>.+?)\".\"(?P<agent>.+?)\"

命名组的结果应如下所示:

ip:57.157.87.86

本地时间:06 / Feb / 2020:00:11:04 +0100

请求:parammore = 1&customer_id = 1&... HTTP / 1.1

ref:https://www.somewebsite.com/more/andheresomemore/

代理:Mozilla / 5.0(Windows NT 10.0; Win64; x64; rv:72.0)...

regex101.com生成对我不起作用的golang代码。我试图改进它,但没有成功。

golang代码仅返回整个字符串而不是组。

package main

import (
    "regexp"
    "fmt"
)

func main() {
    var re = regexp.MustCompile(`(?P<ip>([^\s]+)).+?\[(?P<localtime>(.*?))\].+?GET\s\/\?(?P<request>.+?)\".+?\"(?P<ref>.+?)\".\"(?P<agent>.+?)\"`)
    var str = `57.157.87.86 - - [06/Feb/2020:00:11:04 +0100] "GET /?parammore=1&customer_id=1&version=1.56&param=meaningful&customer_name=somewebsite.de&some_id=4&cachebuster=1580944263903 HTTP/1.1" 204 0 "https://www.somewebsite.com/more/andheresomemore/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0"`

    if len(re.FindStringIndex(str)) > 0 {
        fmt.Println(re.FindString(str),"found at index",re.FindStringIndex(str)[0])
    }
}

在这里找到小提琴https://play.golang.org/p/e0_8PM-Nv6i

regex go
1个回答
1
投票
由于您定义了捕获组并需要提取它们的值,因此需要使用You .FindStringSubmatch

package main import ( "regexp" "fmt" ) func main() { var re = regexp.MustCompile(`(?P<ip>\S+).+?\[(?P<localtime>.*?)\].+?GET\s/\?(?P<request>.+?)".+?"(?P<ref>.+?)"\s*"(?P<agent>.+?)"`) var str = `57.157.87.86 - - [06/Feb/2020:00:11:04 +0100] "GET /?parammore=1&customer_id=1&version=1.56&param=meaningful&customer_name=somewebsite.de&some_id=4&cachebuster=1580944263903 HTTP/1.1" 204 0 "https://www.somewebsite.com/more/andheresomemore/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0"` match := re.FindStringSubmatch(str) fmt.Printf("IP: %s\nLocal Time: %s\nRequest: %s\nRef: %s\nAgent: %s", match[1],match[2], match[3], match[4], match[5]) }

输出:

IP: 57.157.87.86 Local Time: 06/Feb/2020:00:11:04 +0100 Request: parammore=1&customer_id=1&version=1.56&param=meaningful&customer_name=somewebsite.de&some_id=4&cachebuster=1580944263903 HTTP/1.1 Ref: https://www.somewebsite.com/more/andheresomemore/ Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0

© www.soinside.com 2019 - 2024. All rights reserved.