gpt4 book ai didi

java - Guava Splitter 到键值映射,字符串中包含拆分字符

转载 作者:行者123 更新时间:2023-12-02 12:48:18 32 4
gpt4 key购买 nike

我正在尝试使用 Guava splitter 解析日志文件。日志文件如下所示:

appName=XXX clientIp=X.X.X timestamp="2017-06-05T13:22:12-07:00" request="POST /forward HTTP/1.1" statusCode=204 bytesOut=1167 totalTime=0.062 bytesIn=1289 sourceHost=XXXX connId=49936598 connReqs=9 upInstance=XXX:104:XXX-XXX:8664:17F34 upConnectSec=0.052 upAddr="XX.XX.XX:123" upHost="vcv08it-cvcv2801:8464" upHdrTimeSec=0.058 upRespTimeSec=0.058 pid=32561  upStatusCode=204 message="Access Log" corrKey=GMIFCDIKRZR2T4VZQXJA2IT6 upCached=- length=0 partition=XXX location="= /v1/tXXXX" xff="XX.XX.XX.XX" referer="-" user-agent="Apache-HttpAsyncClient/4.1.1 (Java/1.8.0_131)\" rateLimitCurrentValues="--" rateLimitTimeMs=\"-:-"

我用这段代码来解析它:

Map<String, String> parserMap;
parserMap = Splitter.onPattern("\\s(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)")
.omitEmptyStrings()
.withKeyValueSeparator(Splitter.onPattern("="))
.split(line);

我的问题是 location="=/v1/tXXXX"字段,该字段在字符串中包含“=”,而当前的 withKeyValueSeperator 无法解析它。您能帮助我如何更改模式才能正确获取所有字段吗?

最佳答案

不确定 Guava splitter 是如何工作的,但如果您使用常规 PatternMatcher 类,您可以使用下面的正则表达式来捕获您的键和值:

([\w-]+?)=(".*?"|\S+)

<强> Regex demo

Java代码

String text = "your string";
Pattern pattern = Pattern.compile("([\\w-]+?)=(\".*?\"|\\S+)");
Matcher m = pattern.matcher(text);
Map<String, String> parserMap = new HashMap<>();

while (m.find()) {
String key = m.group(1);
String value = m.group(2);
parserMap.put(key, value);
}

这里准备了一个IdeOne java工作演示:

https://ideone.com/y8b8di

您可以看到下面的比赛信息示例

Match 1
Group 1. 0-7 `appName`
Group 2. 8-11 `XXX`

Match 2
Group 1. 12-20 `clientIp`
Group 2. 21-26 `X.X.X`

Match 3
Group 1. 27-36 `timestamp`
Group 2. 37-64 `"2017-06-05T13:22:12-07:00"`

Match 4
Group 1. 65-72 `request`
Group 2. 73-97 `"POST /forward HTTP/1.1"`

关于java - Guava Splitter 到键值映射,字符串中包含拆分字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44683624/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com