我目前正在使用正则表达式来检查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个正则表达式检查吗?
答案 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;
}
每行检查一个假设。这样,代码易于理解且易于扩展。