如何限制十进制数中的总位数

时间:2016-04-29 10:53:56

标签: javascript regex

我有这个正则表达式,它验证字符串是否为十进制数。 此外,它还检查"。"。

后是否最多有9位小数
^[-]?[0-9]+([\.][0-9]{0,9})?$

我需要添加另一个检查,它会限制总位数。

提及:我需要的总位数小于38,包括点后的小数,因此我不能将该范围仅添加到该点之前的小数位。

有效的ex:

      -12345678901234567890123456789.123456789

      123456789012345678901234567890.1

      -1.123456789

2 个答案:

答案 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.561234.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

Regular expression visualization