我正在学习rexExp,我有一个像:
var str =/0+[0-9]/;
console.log(str.test("00f")) //outputs true when I wanted false
我一直在阅读+
匹配零个或多个正则表达式,因此可能有很多零。在此示例中,我只有 2 ,但下一个字符应为数字,([0-9]
),但在00f
f
中是不是数字所以为什么通过测试?
如果你可以解释一下,那就太好了。如果你可以帮我解决我原本想要做的事情,那也很棒?
如果在数字前面有零,我试图制作一个正常的表达式,测试应失败。字符串中应该有已知的字母。 -0
应该失败。以下是一些例子:
004 should fail
00 should fail
04 should fail
4 should pass
400 should pass
0 should pass
-0 should fail
0ab00 should fail
0.004 should fail
答案 0 :(得分:4)
因为0+
会尝试匹配字符串中某处的正则表达式。它不需要匹配整个字符串。在这种情况下,0
将匹配第一个[0-9]
,而0
将匹配第二个/^0+[0-9]$/
。
如果要强制执行完全匹配,则应使用锚点:
^
$
- 字符串的开头0
- 字符串至于你的主要任务 - 我不完全确定这是否是这里所要求的,但我会假设不应该有以0
开头的数字序列。 -0
本身和^(?!.*(\D|^)0\d)(?!.*-0).*
也是不可接受的:
^
这个想法是:
(?!)
- 从字符串的开头.*(\D|^)0\d
- negative lookahead(如果内部模式匹配,则匹配失败).*
- 经过一定数量的字符((\D|^)
),可能为零,\D
- 在非数字字符(|
)或(^
之后})字符串的开头(0
),有一个\d
,后跟另一个数字(0
)。我们这样做是为了确保此.*-0
是当前数字中的第一个数字。.*
- 失败的另一个条件是,如果遇到一些字符(-0
),我们会遇到.*