为什么表达式/ 0 + [0-9] /通过测试" 00f" ? " F"是一封信

时间:2016-01-05 08:46:07

标签: javascript regex

我正在学习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

1 个答案:

答案 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),我们会遇到.*
  • {{1}} - 最后,如果匹配到目前为止没有失败,请匹配该行上的所有字符

See it in action