正则表达式仅在后跟特定单词时返回匹配项

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

我有一个相当长的 json 字符串,其中包含来自不同自动化剧本的许多结果。这是一个简短的片段:

"name":"update_notable_hash","responses":null,"status":"success","type":"generic"},{"action":"add work note","action_run_id":103524,"app_runs":null,"callback":{"cb_called":"yes","cb_fn_name":"hunt_file_1","cb_result":true},"close_time":"2024-05-13T08:31:54.231577+00:00","create_time":"2024-05-13T08:31:54.229+00:00","id":103524,"name":"add_work_note_2","responses":null,"status":"failed","type":""}

我关心的两个字段是“名称”和“状态”,它们之间有可变数量的字段:值对。代码片段中有两个结果 - 第一个结果成功(“status”:“success”),第二个结果失败(“status”:“failed”)。 我只想捕获名称后跟“status”:“failed”的名称。

这是我所能达到的最接近的结果:

\"name\":\"(?<failed_block_name>[^\"]+).+?(?=\"status\":\"failed\")

它确实正确地看到了“status”:“failed”部分,但随后一路回到开头并捕获第一个“name”值。我认为通过使其变得贪婪,它只会查找最接近的“名称”,但事实并非如此。

任何建议将不胜感激,因为我真的很坚持这个。

regex pcre splunk positive-lookahead
1个回答
0
投票

一如既往,如果这不是您的意思,请不要说

.+?

这允许

"field":"value",
重复,但之前不允许
"status":

"name":"(?<failed_block_name>[^\"]+)",(?:"[^"]+":"[^"]+",)*"status":"failed"

我猜你真的不需要反斜杠双引号。我也去掉了前瞻;只需匹配整个内容,但仅捕获您想要提取的部分。

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