如何写这样的一个正则表达式: 字符串由点号和数字组成, 点号必须出现一次且只能出现一次、位置不限, 数字最多出现9次、位置不限

如何只使用正则表达式、而不使用代码的情况下实现以下目标:

1 字符串由点号和数字组成
2 点号必须出现一次且只能出现一次、位置不限
3 数字最多出现9次、位置不限

阅读 6.9k
4 个回答

这样~

/(?=^[.\d]+$)(?=^.*\.)(?!^\d*\.\d*\.)[.\d]{1,10}$/
n=["12.3456789",".123456789","123456789.","12345.67.8","12345..678","a123456789","0.123456789","12.34567890","12.3456","123456","1234567890"]
ptn2 = /(?=^[.\d]+$)(?=^.*\.)(?!^\d*\.\d*\.)[.\d]{1,10}$/
for(x in n){console.log(n[x],ptn2.test(n[x]))}

12.3456789 true
.123456789 true
123456789. true
12345.67.8 false
12345..678 false
a123456789 false
0.123456789 false
12.34567890 false
12.3456 true
123456 false
1234567890 false

简化~

/(?=^.*\.)(?!^.*\..*\.)^[.\d]{1,10}$/

直接来

let reg = /(?!^\d*\..*\.)(?!^\d*$)(^[\d|\.]{0,10})$/;
let test = [
  '.234567890',
  '123456780.',
  '1.34567890',
  '1.3456789',
  '1234567890',
  '1..4567890',
  '1.3.567890',
  '1.3456789a',
  '1.345678901',
  '1e+48'
];
test.forEach(v => console.log(v, reg.test(v)));
// console.log('---- isNaN 是否是数字')
// test.forEach(v => console.log(v, !isNaN(v)));

你的这个数字跟点组合。不就是 小数吗。
去验证最多是九位数字的小数是吗.

function test (str) {

var flag = true,
    reg = /^(\d+)(\.)(\d+)/;   
if(!reg.test(str)) {
    return false
}
str.replace(reg, function (a, b, c, d) {
  
  if(b.length + d.length >9) {
      flag = false
  }
})
return flag

}
。。。。 想了半天想了个很low的fun 就是比较麻烦的去判断一个小数的数字项最多有九位,开头还得有数字才行。 当然这只是判断字符串的一部分。严格要加上 ^ $

下面这样子做的正则是不是楼上想要的
var s = 1.123456789;
var x = 9 - s.toString().split(".")[0].length;
var reg = new RegExp("^(\d{0,})(\.\d{1,"+x+"})$");
console.log(reg.test(s));

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进