为什么这个正则表达式在JavaScript中评估为false?

3

我正在寻找一个只包含0-9数字的字符串,不包含其他字符。

这会以“false”值向我发出警报:

var regex = new RegExp('^[\d]{0,9}$');
alert(regex.test('123456789'));

以下这些语句会返回true,我理解其中的原因(^和$表示整个字符串需要匹配,而不仅是字符串中的一部分):

var regex = new RegExp('[\d]{0,9}');
alert(regex.test('123456789'));

-

var regex = new RegExp('[\d]{0,9}');
alert(regex.test('12345678934341243124'));

并且这将返回true:

var regex = new RegExp('^[\d]{0,9}');
alert(regex.test('123456789'));

那么为什么在结尾添加"$"会导致失败呢?

我需要做什么来解决这个问题呢?


除非您还想匹配其他可能的字符,否则不需要在方括号中使用\d - Simba
1
最简单的解决方案:根本不要使用 new Regex();只需使用内联正则表达式——var regex = /^\d{0,9}$/;。更简单。只有在需要动态定义表达式时才使用 new Regex() - Simba
2
@Jongware 这确实是一个字符串字面量。RegExp 字面量用 / 包围,而不是引号。 - Barmar
2
@Jongware 你错了,这是一个字符串字面量。一个正则表达式字面量应该是/[\d]{0,9}/,这样 OP 就不需要转义反斜杠了。 - sp00m
2
@Jongware 因为其他的例子都没有匹配 d 0 次。 - James Thorpe
显示剩余4条评论
3个回答

8

当您使用

var regex = new RegExp('^[\d]{0,9}$');

语法,你将得到正则表达式

/^[d]{0,9}$/
请注意,\d已经变成了d

这个正则表达式/^[d]{0,9}$/仅匹配零到九个个字母。

RegExp使用字符串定义正则表达式,\也用作字符串中的转义符号,因此\d中的\被视为转义字符。

通过在之前添加另一个\来转义\

var regex = new RegExp('^[\\d]{0,9}$');

我建议您使用正则表达式字面量语法,而不是令人困惑的RegExp语法。

var regex = /^\d{0,9}$/;

编辑:

当使用var regex = new RegExp('^[\d]{0,9}');时,你会得到true的结果,这是因为正则表达式意味着字符串应以任意数量的从零到九的数字开头。因此,即使字符串不以d开头,由于最小出现次数是0,条件也会被满足。

你可能需要检查字符串是否以一到九个数字开头。

var regex = /^\d{1,9}$/;

2
谢谢。我知道我肯定忽略了一些显而易见的东西。 - David
1
@David 另一个问题是你正在使用 {0,9},这意味着先前的组 \d 没有匹配也是允许的,因此在使用正则表达式时会得到奇怪的结果。 - Tushar

2

在定义RegExp对象时,应使用正则表达式文字(不带引号,并使用开始和结束斜杠)。当正则表达式保持不变,即每次使用时不需要编译时,建议采用此方法。这会为您提供所需的结果:

var regex = new RegExp(/^[\d]{0,9}$/);

-5

因为$表示行尾,而你的字符串没有最后一个字符作为行尾

也许你正在寻找"\z"


5
在非多行模式下,“$”表示字符串的结尾。 - James Thorpe
哦,我明白了,我来自 Ruby,它和这个不同 :( - Ismael Fuentes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接