似乎无论我给出什么输入,它总是只匹配1个字符。匹配时m.index
总是0,而m.length
总是1.我在这里做错了什么?我已尝试过(并从中删除了一些代码)http://www.regular-expressions.info/javascriptexample.html并且它在预期中正常工作并匹配整个数字。
您可以在此处查看实时示例http://jsbin.com/aqobe
<html>
<head>
<script type="text/javascript">
function __numberBox__correctFormat(text,allow_float){
var r;
if(allow_float){
r=/\$?[\d,\.\W]+/;
}else{
r=/\$?[\d,\W]+/;
}
var m=r.exec(text);
if(m==null){
return false;
}
alert(m.index); alert(m.length);
if(m.index!=0 || m.length!=text.length){ //must match the whole string
return false;
}
return true;
}
</script>
</head>
<body>
Enter your name: <input type="text" id="fname" onchange="
if(__numberBox__correctFormat(this.value,true)){
alert('tis true');
}else{
alert('tis false');
}" />
</body>
</html>
注意我希望它接受此输入
1234 532,134 $123 493.29
答案 0 :(得分:6)
Regex.exec
的返回值始终是包含匹配列表的数组。在您的情况下,正则表达式将匹配整个字符串,因此返回值是一个包含匹配的1个元素的数组。
/\$?[\d,\.\W]+/.exec("$493.29")
["$493.29"]
答案 1 :(得分:3)
您可以使用以下代码:
var r;
if(allow_float){
r=/^\$?\d[\d,\.\W]+$/;
} else {
r = /^\$?\d[\d,\W]+$/;
}
return r.test(text);
编辑:拒绝单$
。
(未转义)^
和$
字符分别匹配字符串的开头和字符串。因此,如果它与整个字符串匹配,则只返回true
。
顺便说一下,你的正则表达式非常自由;它匹配$1!2@3#4$5%6^7&8*9(0),.1,.4
等字符串。
我建议使用Javascript的内置数字解析方法,如下所示:
function __numberBox__correctFormat(text,allowFloat){
if (text.charAt(0) === '$')
text = text.substring(1);
return (allowFloat ? parseFloat : parseInt)(text.replace(',', ''), 10);
}
如果没有三元聪明,那就像这样:
text = text.replace(',', '');
if(allowFloat)
return parseFloat(text);
return parseInt(text, 10);