1

我正在尝试编写一段正则表达式代码来验证具有 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"]
4

4 回答 4

2

023是一个数字,正则表达式不适用于数字。所以 JavaScript 首先将数字转换为字符串。并且因为零,它是一个八进制数;所以 023 实际上是2 * 8 + 3,而不是2 * 10 + 3

你想做的myRe.exec("023")。此外,您可能想要修改您的正则表达式,以便两位数分支中的第一个数字和最后一个分支中的单个数字读取[1-9],而不是[0-9].

于 2012-12-03T08:17:06.693 回答
2

如果您以 0 开头的数字文字,它将被解释为八进制(以 8 为基数)。所以 052(以 8 为底)实际上是 42(以 10 为底)。然后将其转换为字符串(“42”)并进行正则表达式。

就您的正则表达式而言:我会像这样改进它:

/^1[0-9][0-9]$|^[1-9][0-9]$|^[0-9]$/
于 2012-12-03T08:20:03.300 回答
1

在表达式中

myRe.exec(023);

023是一个八进制数。您要检查的是一个字符串。所以用引号括起来

/^1?\d{1,2}$/- 这是同一正则表达式的更短且更易读的版本。

或者/^1?\d?\d$/你更喜欢哪个。

于 2012-12-03T08:17:20.817 回答
0

您正在将您的 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"]

正如预期的那样。

于 2012-12-03T08:17:51.240 回答