正则表达式求助:匹配指定模式间的目标字符串
嘿,作为正则新手碰到这种结构化字符串的匹配需求很正常,我来给你拆解一下怎么处理你的场景~
首先先把你提供的原始内容贴出来(补全了部分截断的地方,方便演示):
[{"linha":""}, {"linha":" REDE GETNET"}, {"linha":" SANTANDER"}, {"linha":""}, {"linha":"20/04/15 09:07:32 AUT:006299 DOC:000235"}, {"linha":"EC:000000000370484 TERM: T0385403 M"}, {"linha":"CV:010000024 CAIXA:00003333"}, {"linha":""}, {"linha":"CARTAO ************2125"}, {"linha":""}, {"linha":" CREDITO A VISTA"}, {"linha":"VALOR: 12,00"}, {"linha":""}, {"linha":" ______________________________"}]
一、提取所有非空的linha值
如果你只是想把所有{"linha":"XXX"}里的有效内容(排除空值)提取出来,用这个正则就够了:
{"linha":"\s*([^"]*?)\s*"}
正则拆解:
{"linha":":精准匹配固定的前缀部分\s*:匹配内容前后可能存在的空格(你的部分值前面有多余空格,比如" REDE GETNET")([^"]*?):用捕获组提取双引号之间的核心内容,[^"]表示除双引号外的任意字符,*?是非贪婪匹配,避免误抓后面的双引号\s*":匹配结尾的空格和闭合双引号
用这个正则的捕获组1,就能拿到每个非空的linha内容。
二、匹配特定格式的linha值
如果是要定位某一类特定格式的条目,比如日期行、金额行、卡号行,可以针对性写更精准的正则:
1. 匹配日期时间+AUT/DOC行
专门抓20/04/15 09:07:32 AUT:006299 DOC:000235这类格式:
{"linha":"(\d{2}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} AUT:\d{6} DOC:\d{6})"}
2. 匹配金额行
提取VALOR: 12,00里的金额数值:
{"linha":"VALOR: (\d+,\d{2})"}
捕获组1直接拿到12,00这类金额值。
3. 匹配卡号行
提取卡号后四位(前面是12个星号):
{"linha":"CARTAO \*{12}(\d{4})"}
捕获组1会拿到2125这种卡号尾号。
三、额外小建议
如果你的工具/语言支持JSON解析,优先用JSON解析而不是正则,因为正则处理结构化数据容易出bug(比如字符串里出现特殊字符时)。比如用Python可以这么做:
import json # 先把原始内容补全为合法JSON数组 raw_content = '[{"linha":""}, {"linha":" REDE GETNET"}, {"linha":" SANTANDER"}, {"linha":""}, {"linha":"20/04/15 09:07:32 AUT:006299 DOC:000235"}, {"linha":"EC:000000000370484 TERM: T0385403 M"}, {"linha":"CV:010000024 CAIXA:00003333"}, {"linha":""}, {"linha":"CARTAO ************2125"}, {"linha":""}, {"linha":" CREDITO A VISTA"}, {"linha":"VALOR: 12,00"}, {"linha":""}, {"linha":" ______________________________"}]' data_list = json.loads(raw_content) # 遍历提取所有非空的linha内容 for item in data_list: linha_content = item['linha'].strip() if linha_content: print(linha_content)
这种方式比正则更稳定,也更容易维护~
内容的提问来源于stack exchange,提问作者echapp
相关产品推荐
相关产品推荐

