基于正则表达式提取日志中API交易及用户状态数据求助
我帮你修正了正则表达式,解决了行间距适配问题,同时能完整提取你需要的两类结构化数据——交易级汇总信息和所属全量用户明细。下面是具体方案:
修正后的正则(交易级数据+用户块捕获)
(?sm)^(\w+)\t(\w+)\t(\d+)\t(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\t(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\t(\d+)(?:\s*)(.*?)(?=\n\w+\t\w+\t|\Z)
正则逻辑拆解
(?sm):启用多行模式(让^/$匹配每行首尾)和单行模式(让.匹配换行符,方便跨多行捕获用户块)- 交易头捕获组:
^(\w+)\t(\w+)\t(\d+)\t(时间1)\t(时间2)\t(\d+)精准抓取API码、NAT码、数值、起止时间、队列数 (?:\s*):匹配交易头后的任意空白(包括空行、多换行的行间距),彻底解决行间距问题(.*?):非贪婪匹配所有用户行内容,避免过度匹配到下一个交易(?=\n\w+\t\w+\t|\Z):正向预查终止条件,确保在遇到下一个交易头(\nAPI码\tNAT码\t)或文本末尾时停止匹配
用户明细数据提取正则
拿到每个交易的用户块后,用下面的正则逐行匹配用户信息:
^(\w+)\t([^\t]+)\t(\w+)\t(\d+)\t(\d+\.\d+)%?$
用户正则逻辑
^(\w+):捕获用户对应的API码([^\t]+):捕获用户名(支持含特殊字符的用户名,只要不包含制表符)(\w+):捕获状态(如success/fail)(\d+):捕获用户数据数值(\d+\.\d+)%?$:捕获有效率(兼容带%和不带%的格式)
使用流程
- 用第一个正则遍历所有交易,提取每个交易的汇总信息(前6个捕获组)和用户块(第7个捕获组)
- 对每个用户块,用第二个正则逐行匹配,提取每一位用户的明细数据
这样就能完美解决原正则的行间距问题,同时覆盖全量用户数据的提取需求。
内容的提问来源于stack exchange,提问作者powerbucker
相关产品推荐
相关产品推荐

