兼容多地区书写规范的整数与小数匹配正则编写咨询
多书写规范数字匹配正则方案
不需要拆分多段正则分步处理,用带分支分组+反向引用的单条正则即可覆盖所有需求,维护成本远低于多段逻辑拼接。
最终正则
(?<!\d)(?:\d+|\d{1,3}([,. ])\d{3}(?:\1\d{3})*|\d+[,.]\d+|\d{1,3}([,. ])\d{3}(?:\2\d{3})*(?!\2)[,.]\d+)(?![\d,. ])
注:如果需要带注释的可读版本,可使用支持x模式的引擎写法:
(?x) (?<!\d) # 匹配起始位置前不能是数字,避免截断长数字 (?: \d+ # 分支1:纯整数,无任何分隔符、小数点 | \d{1,3}([,. ])\d{3}(?:\1\d{3})* # 分支2:仅带千分位的整数,千分位符号全局统一,后必须跟3位数字 | \d+[,.]\d+ # 分支3:仅带单个小数标记的数字,兼容1.123/1,123这类歧义场景 | \d{1,3}([,. ])\d{3}(?:\2\d{3})*(?!\2)[,.]\d+ # 分支4:带千分位+小数的数字,小数标记与千分位符号不同 ) (?![\d,. ]) # 匹配结束位置后不能是数字或三类符号,避免跨非法串匹配
规则覆盖说明
- 全量支持三类数字书写规范:美式(逗号千分位+点小数点)、欧式(点千分位+逗号小数点)、空格千分位格式,可正常提取句子中非数字包裹的数字,比如
13.4% - 13.7%、less than 123 000nmol/L中的数字均可命中 - 自动过滤所有非法场景:
- 符号相邻的串不会被整体匹配,比如
3..4、10 ,2这类内容只会分段匹配其中的合法数字段 - 小数点后存在其他符号的串不会被整体匹配,比如
12,300.3 3只会分别匹配12,300.3和3 - 千分位后非3位数字的串不会被整体匹配,比如
1 3、200 1232这类内容只会分段匹配独立数字 - 千分位混合使用不同符号的串不会被整体匹配,比如
1 123,123 123会按符号边界分段匹配 - 以前置点/逗号开头的串不会被整体匹配,比如
.40、,40只会匹配其中的40
- 符号相邻的串不会被整体匹配,比如
- 歧义场景兼容:
1.123、1,123这类无法判定符号是千分位还是小数点的内容,会被整体匹配为数字
合法示例匹配校验
所有给定的合法数字均可完整命中:3、13、330,1、3.1021、12 300、1,000,000、20.000.000、1,044.12、1 044,120.12
内容的提问来源于stack exchange,提问作者cuzureau
相关产品推荐
相关产品推荐

