如果小数点同时作为分隔符,如何得到包含小数位的和?
数字模式
-?[0-9]{1,3}(?:[_,.]?[0-9]{3})*[.,]?[0-9]{0,2}
用于从发票文本中获取金额。小数点. 也可以作为数字分隔符,类似于
Summa_apmaksai 1640.09._EUR
尝试获取数值
1640.09
从这段文本使用正则表达式
Summa_apmaksai [ _:€]*(?<summa>-?[0-9]{1,3}(?:[_,.]?[0-9]{3})*[.,]?[0-9]{0,2})[\.\s_€]
但它只返回到第一个小数点之前的数值,1640.
如何得到完整数值 1640.09?
https://regex101.com/r/2iRtWN/1
使用C#和 .NET 10
解决方案
问题出在:
[.,]?[0-9]{0,2}
因为这段被视为可选并允许匹配为空。当正则引擎回溯到 [\.\s_€] 部分时,它会匹配到 ".",并且“意外地”忽略了 "09"。
移除 ?,并强制从 [.,]?[0-9]{0,2} 至少匹配1 位数字,这应该能够解决问题,但前提是你假设所有已匹配的捕获组都包含小数点。
[.,][0-9]{1,2}
为确保在小数点可选时也能安全处理,你可以使用非捕获分组:
(?:[.,][0-9]{1,2})?
完整的正则表达式:
Summa_apmaksai [ _:€]*(?<summa>-?[0-9]{1,3}(?:[_,.]?[0-9]{3})*(?:[.,][0-9]{1,2})?)[\.\s_€]
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。