在javascript中使用Regex进行十进制检查

时间:2014-07-22 09:54:17

标签: javascript jquery regex

我目前正在使用正则表达式来检查JavaScript中的十进制输入。以下是模拟测试用例:

HTML:

<input type="text" id="checkValue" onkeypress="checkKey(event)"/>

JavaScript的:

function checkKey(event) {
    if(event.which == '13') {     //Enter is pressed
        var checkVal = $('#checkValue').val().trim();
        if(checkVal.match("(\d{1,7}\.\d{1,2})|(\.\d{1,2})|(0)")) {
            alert("Matched!");
        } else {
            alert("Not matched!");
        }
    }
}

假设我输入&#34; 123.456&#34;将返回&#34;不匹配!&#34;,但它返回&#34;匹配!&#34;。

期望的结果是:

匹配类型:

.01
1
1.01
0
1234567.89

不匹配类型:

.012
1.098
123.456

作为结论,输入的值最多应为9位数,带或不带小数。 id为十进制,只需要2个位置,例如&#34; 1234567.89&#34;。

这是我第一次踏入Regex,所以有任何建议可以很好地解决这个问题吗?

任何帮助修复上述正则表达式的帮助都会很棒:)

被修改

function checkKey(event) {
    if(event.which == '13') {     //Enter is pressed
        var checkVal = $('#checkValue').val().trim();
        alert(checkVal.match(/^\d{0,7}\.?\d{0,2}|\.\d{0,2}|0$/));
    }
}

同样,我键入的输入&#34; 123.456&#34;,但我得到的警告信息是&#34; 123.45&#34; ...

第二次修改

function checkKey(event) {
    if(event.which == '13') {     //Enter is pressed
        var checkVal = $('#checkValue').val().trim();
        alert(checkVal.match(/^\d{0,7}(\.\d{0,2}|\d{0,2})$/g));
    }
}

我已经改变了

/^\d{0,7}(\.\d{0,2}|\d{0,2})$/g

/^\d{0,7}\.?\d{0,2}$/g

,简化:)

它适用于数字,但如果我想在用户键入时只是&#34;。&#34;并且不被接受?此外,零起动也是不可接受的。我需要分成2个正则表达式检查吗?

3 个答案:

答案 0 :(得分:2)

使用此正则表达式:

^(?=(?:\D*\d){1,9}\D*$)\d*(?:\.\d{2})?$

the regex demo中,查看匹配内容和失败内容。

<强>解释

  • ^锚点断言我们位于字符串的开头
  • 前瞻(?=(?:\D*\d){1,9}\D*$)断言接下来是任意数量的非数字后跟一个数字,一到九次,然后是可选的非数字和字符串的结尾(强制执行9位数限制)
  • \d*匹配可选数字
  • (?:\.\d{2})?可选择匹配句点,然后是两位数
  • $锚点断言我们位于字符串的末尾

选项2

\d{0,7}的灵感来自@ IvyLynx的^[0-9]{0,7}(\.[0-9]{1,2}|[0-9]{0,2})$,根据我的理解不符合点后两位数的要求 - 虽然我可能误解了:

^\d{0,7}(?:\.\d{2}|\d{0,2})$

请参阅the demo

答案 1 :(得分:2)

这里是

^[0-9]{0,7}(\.[0-9]{1,2}|[0-9]{0,2})$

test

匹配数字,零到七次(9-2),然后查看是否有小数点,最多2位最多两位数(对于a最多9位数,小数或不小数。)

编辑 - 对于多种小数点,表达式为becomes

^[0-9]{0,7}([\.,][0-9]{1,2}|[0-9]{0,2})$

虽然也可以使用OR表达式:

^[0-9]{0,7}((\.|,)[0-9]{1,2}|[0-9]{0,2})$

请记住,这将检查可能小数点的一个,但它也会匹配任何。换句话说,它不关心你是否有不同小数点的数字,它将匹配所有它们,无论它们具有哪个符号,只要它们只有一个并且它&#&## 39;其中一个封闭的。

答案 2 :(得分:1)

我觉得这是对正则表达式的滥用。我建议改为编写验证方法(伪代码):

validate(input):
    text = input.replace('.', '')
    if(text.length > 9) return false;
    if(! /^\\d+$/.matches(text)) return false;
    pos = input.indexOf('.')
    if(pos < input.length-2) return false;
    if(index.count('.') > 1) return false;
    return true;
}

每行检查一个假设。这样,代码易于理解且易于扩展。