如何编写匹配仅含数字和逗号输入的正则表达式?
符合要求的输入校验正则方案
原有正则的问题
你之前使用的/^\d*(,\d*)*$/存在的缺陷是:开头的\d*允许匹配0长度的空内容,当输入以英文逗号开头时,开头的\d*匹配空,后续的(,\d*)分组就可以匹配到开头的逗号和后续内容,会错误将,2,3这类非法输入判定为合法。
正确正则及说明
如果不需要兼容空输入的场景,推荐使用如下正则:
/^\d+(,\d*)*$/
如果需要兼容空输入(也就是0个数字的场景),可以使用这个版本:
/^(?:\d+(,\d*)*)?$/
规则匹配逻辑说明
- 开头的
\d+保证输入非空时,第一个字符一定是数字,完全规避开头出现逗号的非法情况 - 后续
(,\d*)*表示可以重复0次或多次「英文逗号+任意个数数字」的组合:- 当逗号后有数字时,匹配
数字,数字的正常分隔格式 - 当逗号后无数字时,就匹配末尾悬空的单个逗号的场景
- 当逗号后有数字时,匹配
- 整个表达式仅允许数字和英文逗号两种字符出现,满足字符范围限制
如果你需要额外禁止连续逗号的场景(即不允许出现
1,,2这类输入),可以使用如下正则:/^\d+(?:,\d+)*,?$/这个版本会要求逗号之间至少有一个数字,仅允许末尾出现一个悬空逗号,不会匹配连续逗号的情况。
测试用例验证
我们可以用你给出的测试用例做校验:
合法输入全部通过
1,2,4→ 匹配成功1221,212,4121212→ 匹配成功1,2,3,→ 匹配成功11,21111,31111,→ 匹配成功
非法输入全部拦截
,2,3→ 匹配失败
内容的提问来源于stack exchange,提问作者Max Bunker
相关产品推荐
相关产品推荐

