Regex验证0-100的数字,最多有两个小数点


Regex to validate numbers 0-100 with up to two decimal places

所以我知道使用php is_numeric函数会更容易,但我要做的是创建一个正则表达式,主要用于学习正则表达式,以测试考试成绩。范围可以是0-100,但可以有2位小数。这是我目前使用的,但它不起作用。

  if (preg_match("^([0-9]){2,3})(.[0-9]{2})?$([0-9]{1})?$", $quiz1))
    {
        echo "match";
    }
    else {
        $error = true;
    }

如果我没想错的话,字面意思是:

字符串的开始找到字符0-9,为两个位置。可选的字符串十进制结尾,查找字符0-9,用于两个位置。

为什么不这样呢?

 /^(?:100|'d{1,2})(?:'.'d{1,2})?$/
    ^ -字符串的开头
  • (?:100|'d{1,2}) -非捕获组,100或0-99
  • (?:。' d {1,2}) ?-可选非抓包组。# or .##)
  • $ -结束字符串

结果:

php

> $测试=阵列(0、5、10、50、100,99.5,75.43,75.436,101年),

php> foreach ($test作为$test){打印$test。"-"。preg_match ("/^ (?: 100 | ' d {1,2}) (?: ' ' d {1,2}) ?$/", $test)。"' n";}

0 - 1

5 - 1

10 - 1

50 - 1

100 - 1

99.5 - 1

75.43 - 1

75.436 - 0

101 - 0

即使我添加斜杠并删除额外的),您的也不起作用。

php> foreach ($test作为$test){打印$test。"-"。preg_match("/^([0 - 9]{2,3})([0 - 9]{2}) ?美元([0 - 9]{1})?$/", $test)。"' n";}0 - 0

5 - 0

10 - 1

50 - 1

100 - 1

0

75.43 - 1

75.436 - 0

101 - 1

/字符包围表达式

http://php.net/manual/en/regexp.reference.delimiters.php

gpojd的答案正确。然而,这就是为什么你的正则表达式不能工作。

首先,第一个$要放在()里面。因为否则它将需要匹配字符串的末尾,然后再匹配字符串的末尾,这当然是不可能的。

第二,点字符需要变成'。因为点本身可以匹配任何字符,但你需要一个真正的点。最后,您需要分隔符,就像其他人建议的那样。以下是您的regex匹配的内容:

第一个,两位或三位数字,必选。然后,任意后跟两位数字的字符,可选。然后,字符串结束,强制。然后,一个数字,可选。然后,再次返回字符串的末尾,强制。

既然你是一个程序员,你可能很难习惯正则表达式的思维方式;你习惯用if-else语句来思考,但是正则表达式并不是这样的。

同样,上面的选项已经足够好了,但是如果我要为此写一个正则表达式,我会写:

/^100(.00)?|([1-9]?[0-9])('.[0-9]{2})?$/

所以,要么100后面跟着一个可选的。00,要么:首先是一个可选的非零数字,然后是一个必选的数字(这些数字使数字0到99),然后是一个可选的点后面跟着两个数字。