javascript中的正则表达式总是只匹配1个字符?

时间:2010-01-19 21:48:44

标签: javascript regex

似乎无论我给出什么输入,它总是只匹配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

2 个答案:

答案 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);