【问题标题】:Javascript Regular Expression for numbers数字的 Javascript 正则表达式
【发布时间】:2018-02-01 04:43:37
【问题描述】:

我正在尝试制作一个 HTML 表单,该表单通过用户的输入字段接受评分。评级是从 0 到 10 的数字,我希望它最多保留两位小数。我正在尝试使用正则表达式,如下

function isRatingGood()
{
    var rating = document.getElementById("rating").value;
    var ratingpattern = new RegExp("^[0-9](\.[0-9][0-9]?)?$");

    if(ratingpattern.test(rating))
    {
        alert("Rating Successfully Inputted");
        return true;
    }
    else
    {
        return rating === "10" || rating === "10.0" || rating === "10.00";
    }
}

但是,当我在字段中输入任何 4 或 3 位数字时,它仍然有效。它输出警报,所以我知道它是失败的正则表达式。 5 位数字不起作用。我使用this previous answer 作为基础,但它对我来说不能正常工作。

我目前的理解是表达式的开头应该是一个数字,然后可选地,一个小数位后跟1或2位数字应该被接受。

【问题讨论】:

  • 为什么您需要精确到小数点后两位的评级?假设“评分”是“您如何享受我们的服务?”输入东西,谁会说“6.41”?
  • 很好的问题。说实话,我没有,但我正在查看有两位小数的价格(显然)。这让我想到了如何使用正则表达式来表示评分的可选十进制表示。它对于评级系统没有实际用途,但当我想到它时,我正在处理我的 HTML 代码中的评级。我猜都是为了学习。

标签: javascript regex


【解决方案1】:

您正在使用字符串文字来创建正则表达式。在字符串文字中,\ 是转义字符。字符串字面量

"^[0-9](\.[0-9][0-9]?)?$"

产生值(和正则表达式):

^[0-9](.[0-9][0-9]?)?$

(您可以通过在浏览器的控制台中输入字符串文字来验证)

\. 不是字符串文字中的有效转义序列,因此将忽略反斜杠。下面是类似的例子:

> "foo\:bar"
"foo:bar"

所以你可以在上面看到,. 没有在正则表达式中转义,因此它保持其特殊含义并匹配任何字符。转义字符串文字中的反斜杠以创建文字 \:

> "^[0-9](\\.[0-9][0-9]?)?$"
"^[0-9](\.[0-9][0-9]?)?$"

或使用正则表达式:

/^[0-9](\.[0-9][0-9]?)?$/

【讨论】:

  • @MaxZoom:如果您查看问题中的代码,OP 会单独处理这种情况。当然有更简洁的方法来处理这个整体,但我只关注实际问题。
  • 正则表达式只处理小数点前的第一位。这就是为什么我有 else 语句。这适用于 0.00-9.99。
  • 我同意,可能有更简洁的方法可以做到这一点。我只是想不出他们。
  • @mojo1mojo2:看看 MaxZoom 的回答。
【解决方案2】:

您使用的正则表达式将被解析为

/^[0-9](.[0-9][0-9]?)?$/

这里. 将匹配除换行符以外的任何字符。

要使其匹配 . 文字,您需要添加额外的 \ 以转义 \

var ratingpattern = new RegExp("^[0-9](\\.[0-9][0-9]?)?$");

或者,您可以简单地使用

var ratingPattern = /^[0-9](\.[0-9][0-9]?)?$/;

您也可以使用\d 代替[0-9] 类。

var ratingPattern = /^\d(\.\d{1,2})?$/;

演示

var ratingpattern = new RegExp("^[0-9](\\.[0-9][0-9]?)?$");

function isRatingGood() {
  var rating = document.getElementById("rating").value;

  if (ratingpattern.test(rating)) {
    alert("Rating Successfully Inputted");
    return true;
  } else {
    return rating === "10" || rating === "10.0" || rating === "10.00";
  }
}
<input type="text" id="rating" />

<button onclick="isRatingGood()">Check</button>

【讨论】:

    【解决方案3】:

    在下面找到适合您任务的正则表达式候选:

    ^[0-1]?\d(\.\d{0,2})?$
    

    Demo 附解释

    var list = ['03.003', '05.05', '9.01', '10', '10.05', '100', '1', '2.', '2.12'];
    var regex = /^[0-1]?\d(\.\d{0,2})?$/;
    
    for (var index in list) {
      var str = list[index];
      var match = regex.test(str);
      console.log(str + ' : ' + match);
    }

    【讨论】:

    • FWIW,{0,1} 等价于 ?(更短)。
    【解决方案4】:

    这也应该可以完成这项工作。您不需要从方括号内转义点:

    ^((10|\d{1})|\d{1}[.]\d{1,2})$
    

    如果你想获得最高评分 10,请使用

    10| ----接受10

    \d{1})| ---- 接受 0-9 的整数,如果不想在其中使用 0,则将 \d 替换为 [1-9]{1} p>

    \d{1}[.]\d{1,2} ---- 接受从 0 到 9 的逗号后有两个或一个数字的数字

    现场演示:https://regex101.com/r/hY5tG4/7

    除 ^-]\ 之外的任何字符 除了列出的特殊字符之外的所有字符都是文字字符,它们将自身添加到字符类中。 [abc] 匹配 a、b 或 c literal characters

    【讨论】:

    • 为什么是(10){1} 而不是10?保持简单。
    • 同意 - 这将是最佳的
    • 它匹配100 的子字符串并且不匹配单个数字,即5 参见here
    • 你能看到那里的管道吗?解释它是如何匹配 100 的。我看不到它。它的 10 或表达式的其余部分。
    【解决方案5】:

    我自己回答了这个问题。

    需要给小数点加上方括号,所以正则表达式的样子

    var ratingpattern = new RegExp("^[0-9]([\.][0-9][0-9]?)?$");
    

    【讨论】:

    • 这可能“有效”,但不是出于您可能认为的原因。
    • 是的,我就是这么想的。没有意识到需要转义反斜杠,而不是句号。
    • 完整的顶部 does 需要在正则表达式中进行转义,这就是反斜杠的用途,但在你到达那一步之前,反斜杠本身需要在您用于创建正则表达式的字符串文字。
    • 谢谢。我现在知道字符串和正则表达式需要区别对待:)
    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多