正则表达式无法捕获换行后带前置空格的金额数值问题求助
问题描述
现有文本内容:
The string we have right now is:
DB GOALS: DISADVANTAGED BUSINESS ENTERPRISE - 6.0%
PROPOSALS ISSUED 9 FUND TOTAL , , 0
TOTAL NUMBER OF WORKING DAYS 30NUMBER OF BIDDERS 4 ENGINEERS EST 1,674,885.00 AMOUNT OVER
177,014.00 PERCENT OVER EST 10.57
PROGRAM ELEMENTS
使用正则模式:
(AMOUNT OVER|AMOUNT UNDER)[\n\r\s]+(?:^|\s)(?=.)((?:0|(?:[1-9](?:\d*|\d{0,2}(?:,\d{3})*)))?(?:\.\d*[0-9])?)(?!\S)
无法捕获AMOUNT OVER换行后带前导空格的177,014.00,移除数值前的空格后正则可正常工作,需调整正则直接捕获该内容。
问题原因
原正则中[\n\r\s]+会匹配AMOUNT OVER之后的所有空白(包括换行和数值前的空格),导致后续的(?:^|\s)无匹配项——此时已到达数值的第一个字符1,前面既无行首(换行和空格已被[\n\r\s]+匹配)也无剩余空格,正则匹配失败。
解决方案
移除正则中多余的(?:^|\s)断言,让[\n\r\s]+匹配完所有空白后直接捕获数值部分,调整后的正则:
(AMOUNT OVER|AMOUNT UNDER)\s+((?:0|(?:[1-9](?:\d*|\d{0,2}(?:,\d{3})*)))?(?:\.\d*[0-9])?)(?!\S)
也可简化数值匹配逻辑(更简洁且兼容带千分位、小数的金额):
(AMOUNT OVER|AMOUNT UNDER)\s+(\d+(?:,\d{3})*(?:\.\d+)?)
验证说明
调整后的正则会先匹配AMOUNT OVER或AMOUNT UNDER,再匹配任意数量的空白(含换行、前导空格),最后直接捕获符合格式的金额数值,无需手动移除空格即可正常匹配目标内容。
内容的提问来源于stack exchange,提问作者Pepa

