我正在尝试编写一段正则表达式代码来验证具有 1、2 或 3 位数字的简单形式的年龄。如果它有 3 位数字,则前导数字必须是 1,并且前导数字永远不会是 0。
到目前为止我所拥有的:
/^1[0-9][0-9]$|^[0-9][0-9]$|^[0-9]$/
这种奇怪行为的一个例子:
> myRe = /^1[0-9][0-9]$|^[0-9][0-9]$/;
> myRe.exec(023);
["19"]
> myRe.exec(052);
["42"]
我正在尝试编写一段正则表达式代码来验证具有 1、2 或 3 位数字的简单形式的年龄。如果它有 3 位数字,则前导数字必须是 1,并且前导数字永远不会是 0。
到目前为止我所拥有的:
/^1[0-9][0-9]$|^[0-9][0-9]$|^[0-9]$/
这种奇怪行为的一个例子:
> myRe = /^1[0-9][0-9]$|^[0-9][0-9]$/;
> myRe.exec(023);
["19"]
> myRe.exec(052);
["42"]
023
是一个数字,正则表达式不适用于数字。所以 JavaScript 首先将数字转换为字符串。并且因为零,它是一个八进制数;所以 023 实际上是2 * 8 + 3
,而不是2 * 10 + 3
。
你想做的myRe.exec("023")
。此外,您可能想要修改您的正则表达式,以便两位数分支中的第一个数字和最后一个分支中的单个数字读取[1-9]
,而不是[0-9]
.
如果您以 0 开头的数字文字,它将被解释为八进制(以 8 为基数)。所以 052(以 8 为底)实际上是 42(以 10 为底)。然后将其转换为字符串(“42”)并进行正则表达式。
就您的正则表达式而言:我会像这样改进它:
/^1[0-9][0-9]$|^[1-9][0-9]$|^[0-9]$/
在表达式中
myRe.exec(023);
023
是一个八进制数。您要检查的是一个字符串。所以用引号括起来
/^1?\d{1,2}$/
- 这是同一正则表达式的更短且更易读的版本。
或者/^1?\d?\d$/
你更喜欢哪个。
您正在将您的 RegExp 应用于一个数字。RegExps 需要一个字符串参数。
所以:
> myRe = /^1[0-9][0-9]$|^[0-9][0-9]$/;
> myRe.exec('023');
null
> myRe.exec('23');
["23"]
> myRe.exec('052');
null
> myRe.exec('52');
["52"]
正如预期的那样。