问题描述
我正在尝试解析报告。以下是我需要解析的文本示例:
7605625112 DELIVERED N 1 GORDON CONTRACTORS I SIPLAST INC Freight Priority 2000037933 $216.67 1,131 ROOFING MATERIALS
04/23/2021 02:57 PM K WRISHT N 4 CAPITOL HEIGHTS,MD ARKADELPHIA,AR Prepaid 2000037933 -$124.23 170160-00
04/27/2021 12:41 PM 2 40 20743-3706 71923 $.00 055 $.00
2 WBA HOT $62.00 0
$12.92 $92.44
$167.36
7605625123 DELIVERED N 1 SECHRIST HALL CO SIPLAST INC Freight Priority 2000037919 $476.75 871 PAIL,UN1263,PAINT,3,04/23/2021 02:57 PM S CHAVEZ N 39 HARLINGEN,TX ARKADELPHIA,AR Prepaid 2000037919 -$378.54
04/27/2021 01:09 PM 2 479 78550 71923 $.00 085 $95.35
2 HRL HOT $62.00 21
$13.55 $98.21
$173.76
这由两个或多个以 "[0-9]{10}\sDELIVERED"
开头的块和下一个块之前的最后一个货币字符串组成。
如果我使用 "(?s)([0-9]{10}\sDELIVERED)(.*)(?<=\$167.36\n)"
进行测试,我成功地获得了第一个区块,但如果我使用 "(?s)([0-9]{10}\sDELIVERED)(.*)(?<=\$\d\d\d.\d\d\n)"
,它会抓住一切。
如果有人可以向我展示返回两个或更多块所需的更改,我将不胜感激。
解决方法
*
是一个贪心操作符,所以它会尝试匹配尽可能多的字符。另见Repetition with Star and Plus。
为了修复它,你可以使用这个正则表达式:
(?s)(\d{10}\sDELIVERED)((.(?!\d{10}\sDELIVERED))*)(?<=\$\d\d\d.\d\d)
其中我基本上用 .*
替换了 (.(?!\d{10}\sDELIVERED))*
,以便它检查每个字符后面是否跟有 \d{10}\sDELIVERED
。
观看演示here