我有这个正则表达式,它验证字符串是否为十进制数。 此外,它还检查"。"。
后是否最多有9位小数^[-]?[0-9]+([\.][0-9]{0,9})?$
我需要添加另一个检查,它会限制总位数。
提及:我需要的总位数小于38,包括点后的小数,因此我不能将该范围仅添加到该点之前的小数位。
有效的ex:
-12345678901234567890123456789.123456789
123456789012345678901234567890.1
-1.123456789
答案 0 :(得分:3)
使用否定前瞻:
^(?=(?:\D*\d){n}\D*$)[-]?[0-9]+(?:\.[0-9]{0,9})?$
^^^^^^^^^^^^^^^^^^^^
其中n
是输入字符串中数字位数的限制参数。
实施例:
^(?=(?:\D*\d){7}\D*$)-?[0-9]+(?:\.[0-9]{0,9})?$
将与1234.567
匹配,但不会与1234.56
和1234.5678
匹配。
请参阅regex demo
现在,
我需要的总位数小于38
只需使用否定前瞻:
^(?!(?:\D*\d){38})-?[0-9]+(?:\.[0-9]{0,9})?$
^^^^^^^^^^^^^^^^^
如果字符串中有38个(由于(?!(?:\D*\d){38})
个数字而没有强制连续)数字,此\D*
前瞻将使匹配失败。
模式说明:
^
- 字符串开头(?!(?:\D*\d){38})
- negative lookahead将尝试匹配0+非数字(\D*
),后跟数字正好匹配38次,如果匹配该文字,不会返回匹配-?
- 一个可选的(1或0)连字符(不需要将它放入字符类,因为它不是特殊的正则表达式元字符)[0-9]+
- 1位数字(使用\d
代替缩短)(?:\.[0-9]{0,9})?
- 可选的(1或0次出现)序列:
\.
- 一个文字点[0-9]{0,9}
- 0到9位数(再次,\d{0,9}
更短)$
- 字符串结尾如果您只需检查整数部分少于38位,请
^(?!(?:[^\d.]*\d){38})[-]?[0-9]+(?:\.[0-9]{0,9})?$
请参阅此regex demo
答案 1 :(得分:1)
你可以使用正面预测断言的正则表达式 /^-?(?=[.\d]{0,39}$)\d{0,38}(\.\d{1,9})?$/
$('input').on('input', function() {
$(this).css('color', /^-?(?=[.\d]{0,39}$)\d{0,38}(\.\d{1,9})?$/.test(this.value) ? 'green' : 'red');
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input>
<强> Regex explanation 强>