求符合特定数字格式的正则表达式(含格式校验规则)
符合要求的正则表达式解决方案
需求规则梳理
有效格式规则
- 整数:仅允许
0,或无前导零的正整数(如25、100) - 小数:
- 整数部分为
0或无前导零的正整数 - 小数部分至少包含一个非零数字,且结尾不能为零(如
15.31、0.123、25.01)
- 整数部分为
- 分数形式:
- 两侧均为有效整数/小数,用单个斜杠分隔(如
25/25、0/0、25.5/25) - 若带百分号,则两侧必须同时带
%(如25%/25%、0.125%/0.125%)
- 两侧均为有效整数/小数,用单个斜杠分隔(如
无效格式规则
- 连续多个零(如
0000) - 小数部分全为零或结尾为零(如
0.0、25.00、25.0500) - 含前导零的整数(如
02) - 单侧带百分号的分数(如
25%/25) - 连续斜杠(如
25//25)
最终正则表达式
/^(?:0|[1-9]\d*|0\.\d*[1-9]|[1-9]\d*\.\d*[1-9])(?:\/(?:0|[1-9]\d*|0\.\d*[1-9]|[1-9]\d*\.\d*[1-9]))?$|^(?:(?:0|[1-9]\d*|0\.\d*[1-9]|[1-9]\d*\.\d*[1-9])%\/(?:0|[1-9]\d*|0\.\d*[1-9]|[1-9]\d*\.\d*[1-9])%)$/gm
正则表达式详细解释
第一分支:单个有效数字或不带百分号的分数
^(?:0|[1-9]\d*|0\.\d*[1-9]|[1-9]\d*\.\d*[1-9]):匹配单个有效数字0:匹配单独的零[1-9]\d*:匹配无前导零的正整数0\.\d*[1-9]:匹配整数部分为0的有效小数(小数部分结尾非零)[1-9]\d*\.\d*[1-9]:匹配整数部分非零开头的有效小数(小数部分结尾非零)
(?:\/(?:0|[1-9]\d*|0\.\d*[1-9]|[1-9]\d*\.\d*[1-9]))?$:可选的分数后缀,匹配单个斜杠加另一个有效数字,确保仅出现一次斜杠
第二分支:带百分号的分数
^(?:(?:0|[1-9]\d*|0\.\d*[1-9]|[1-9]\d*\.\d*[1-9])%\/(?:0|[1-9]\d*|0\.\d*[1-9]|[1-9]\d*\.\d*[1-9])%)$:强制要求两侧有效数字都带%,且用单个斜杠分隔,避免单侧带%的无效情况
测试验证
- 支持所有有效格式,包括之前正则不兼容的
0.2%/0.1%、0.123/0.123 - 所有无效格式均无法匹配
内容的提问来源于stack exchange,提问作者Pedro Martins
相关产品推荐
相关产品推荐

