如何用正则表达式提取JSON中第一个非空的videoUrl字段
提取JSON中第一个非空
videoUrl的正确正则写法 问题根源
你的原始正则("videoUrl":)("http.+")有两个明显问题:
- 贪婪匹配:
http.+会一直匹配到字符串末尾的双引号,导致把后面的JSON内容也错误包含进来 - 未兼容JSON格式细节:没考虑字段与值之间可能存在的空格,也没限定只取第一个符合条件的结果
正确正则表达式
试试这个正则,同时确保你的正则工具/代码只取首次匹配结果:
"videoUrl"\s*:\s*"http[^"]+"
正则逻辑拆解:
\s*:匹配0个或多个空格,兼容JSON里videoUrl和冒号、冒号和值之间的任意空格"http[^"]+":精准匹配以http开头的非空值,[^"]表示只匹配到下一个双引号为止,彻底避免过度贪婪的问题- 只取首次匹配,就能拿到JSON结构中第一个非空的
videoUrl字段
测试你的示例JSON
针对你提供的JSON:
{ "videoUrl":"", "available":"true", "movie":{ "videoUrl":"http..." }, "account":{ "videoUrl":"http...", "login":"", "password":"" } }
这个正则首次匹配的结果就是你想要的:"videoUrl":"http..."
更稳妥的替代方案
其实处理JSON最好用专门的解析库,比正则更可靠,比如Python的示例代码:
import json json_data = '{ "videoUrl":"", "available":"true", "movie":{ "videoUrl":"http..." }, "account":{ "videoUrl":"http...", "login":"", "password":"" } }' parsed = json.loads(json_data) def get_first_non_empty_vid_url(obj): if isinstance(obj, dict): # 先检查当前对象是否有非空的videoUrl if "videoUrl" in obj and obj["videoUrl"].strip() != "": return f'"videoUrl":"{obj["videoUrl"]}"' # 递归遍历子对象 for val in obj.values(): res = get_first_non_empty_vid_url(val) if res: return res return None print(get_first_non_empty_vid_url(parsed))
运行后会输出预期的"videoUrl":"http...",这种方法能处理更复杂的JSON嵌套结构,不会因为格式变化出错。
内容的提问来源于stack exchange,提问作者Almas Abdrazak
相关产品推荐
相关产品推荐

