Регулярное выражение в JavaScript всегда соответствует только 1 символ? - PullRequest
1 голос
/ 20 января 2010

Кажется, что независимо от того, какой ввод я даю, он всегда соответствует только 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 ]

6 голосов
/ 20 января 2010

Возвращаемое значение Regex.exec всегда является массивом, содержащим список совпадений.В вашем случае регулярное выражение будет соответствовать всей строке, поэтому возвращаемое значение представляет собой массив с 1 элементом, который содержит совпадение.

/\$?[\d,\.\W]+/.exec("$493.29")
["$493.29"]
3 голосов
/ 20 января 2010

Вы можете использовать следующий код:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...