JavaScript正则表达式验证逗号分隔数字的格式

10

我有一个文本框,它可以有像11,21,225,345,21(即多个值)的值。但现在我想要验证这个输入。

toString().match(/^(([0-9](,)?)*)+$/)

这是我正在使用的代码,它只验证正确性,但当用户输入像这样的值时会出现问题:

inputval:1,22,34,25,645(true)
inputval:1,22,34,25,645,(false)

当用户在结尾输入逗号 (,) 时,它应该抛出一个错误。

可以有人帮我吗?

2个回答

26

只需手动包含至少一个:

/^[0-9]+(,[0-9]+)*$/

let regex = /[0-9]+(,[0-9]+)*/g

console.log('1231232,12323123,122323',regex.test('1231232,12323123,122323')); 
console.log('1,22,34,25,645,',regex.test('1,22,34,25,645,'));
console.log('1',regex.test('1'));                  


运行相同的正则表达式测试多次会导致不同的结果。我遇到了什么? - Himanshu
1
@Himanshu "当JavaScript RegExp对象设置了全局或粘性标志(例如/foo/g或/foo/y)时,它们是有状态的。它们会存储先前匹配的lastIndex。在内部使用这个属性,test()方法可以用于在文本字符串中迭代多个匹配项(包括捕获组)"。来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test - Ariel

5
变种 Ariel 正则表达式 :-)
/^(([0-9]+)(,(?=[0-9]))?)+$/
,必须后跟一个数字(?=[0-9])

或者

/^(([0-9]+)(,(?!$))?)+$/
,后面不能跟字符串结尾(?!$)
/^(?!,)(,?[0-9]+)+$/

我们检查第一个字符是否不是,(?!,),然后我们将可选的,放置在数字前面。这是可选的,因为数字的第一个块不需要它。

我会完全放弃(x+y?) +模式 - 它很容易导致灾难性回溯 - Kobi
@Kobi 一如既往,你能做什么和你应该用正则表达式做什么是完全不同的事情 :-) - xanatos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接