如果小数点同时作为分隔符,如何得到包含小数位的和?

编程语言 2026-07-09

数字模式

-?[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_€]

示例 @ regex101

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章