javascript - 写了一个验证12.5-20.5的正则老是报错?
问题描述
要求的数据格式为:1101001-510-50100-5000.510.510.5-2010.5-20.510-20.5
也就是要求验证的数字大小不限,可以有浮点数可以没有,可以有“-”可以没有,保留一位小数
这是我写的正则表达式:
下面的复制错了:
var a=/^d{1,}.?d?-?(d{1,})?.?d?$/;
更正为:
var a=/^d{1,}.?d{1}?-?(d{1,})?.?d{1}?$/;
但是20.5555一直为true是咋回事?
问题解答
回答1:/^d{1,}.?d?-?(d{1,})?.?d?$/匹配过程如下:首先d{1,}匹配的是'20';.?匹配'.';d?匹配'5',?匹配了1次;-?匹配'',因为?匹配0或者1次,在这里匹配0次;(d{1,})?匹配'555',此时?匹配1次;.?d?匹配'',此时两个?都匹配0次;$匹配字符串结尾,所以'20.5555'可以匹配。
Update1:/^d{1,}.?d{1}?-?(d{1,})?.?d{1}?$/的匹配过程如下:
d{1,}匹配'20';
.?匹配'.';
d{1}?会首先尝试匹配一个数字,此时匹配'5',?匹配1次;
-?会匹配'',此时?匹配0次;
(d{1,})?匹配'555';
.?匹配'',此时?匹配0次;
d{1}?匹配'',?匹配0次;d{1}表示数字重复一次,所以该正则和d其实是一样的,所以更新后的正则表达式和原先的正则表达式没有区别。
注:一开始写的匹配过程有点儿问题,现在已经更新。
回答2:const regex = /^d+(?:.d)?(?:-d+(?:.d)?)?$/;const cases = [ '1', '10', '100', '1-5', '10-50', '100-500', '0.5', '10.5', '10.5-20', '10.5-20.5', '10-20.5', '20.5555', '20.5-20.5555'];const r = cases.map(s => regex.test(s));console.log(r);
回答3:???为啥要用正则
相关文章:
1. angular.js - 用angular2-cli打包项目之后,跳转路由刷新会报404的错误2. angular.js - angular2动态显示隐藏组件问题3. angular.js - 在用会话存储传递参数时,使用angularjs冲突4. angular.js - 请教angularjs里html和js通信的问题5. jquery - angularjs的数据为什么渲染不到页面上?数据获取到了,我的代码哪里出了错了?6. angular.js - 我想实现打印angular $scope数据,代码如何实现呢?求教(如下图)7. node.js - 怎么在初始化的时候使得一个子组件不加载?8. python - 如何在docker上部署pyspider9. python - Ubuntu16.04LTS登录后只显示屏保10. Python中的内列表问题,真的很困惑