正则表达式匹配仅在status:failed前的name字段(适配含引号场景)
解决方案
核心问题拆解
你遇到的两个关键问题:
- 正则匹配到了最开头的
name而非紧邻failed的字段——原正则未限定匹配范围,导致跨JSON对象匹配。 - 含转义引号的
name值无法正确捕获——原正则用[^"]+直接排除所有引号,未考虑JSON字符串的转义规则。
修正后的正则表达式
(?s)\{"name":"((?:\\.|[^"\\])+)"(?:(?!\}).)*?"status":"failed"
正则规则说明
(?s):启用单行模式,让.可以匹配换行符,适配多行格式的JSON\{:匹配JSON对象的起始大括号,确保只在当前失败任务的对象内匹配"name":"((?:\\.|[^"\\])+)":正确捕获带转义引号的name值:(?:\\.|[^"\\])+:匹配规则为「要么是转义字符(如\"),要么是非引号、非反斜杠的普通字符」,完美兼容JSON字符串的格式要求
(?:(?!\}).)*?:非贪婪匹配任意字符,但不会跨过下一个大括号,严格限定在当前JSON对象内,避免误匹配其他对象的name"status":"failed":定位目标失败状态,确保匹配的是紧邻它的name
测试示例
针对如下JSON片段:
{"name":"Backup Data","status":"success"},{"name":"Deploy \"v2.0\" Service","status":"failed"}
捕获组1会得到:Deploy \"v2.0\" Service(若需要去除转义,可在后续代码中用对应语言的字符串处理方法,比如Python的ast.literal_eval)
额外建议
如果场景允许,优先使用JSON解析器处理而非正则——比如Python中可将JSON字符串转成列表/字典,遍历找到status为failed的项直接提取name值,这种方式比正则更稳定,无需手动处理转义问题。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

