Javascript 为什么表达式/0+;[0-9]/通过“测试”;00f"&引用;f";这是一封信

Javascript 为什么表达式/0+;[0-9]/通过“测试”;00f"&引用;f";这是一封信,javascript,regex,Javascript,Regex,我正在学习rexExp,我有一个: var str =/0+[0-9]/; console.log(str.test("00f")) //outputs true when I wanted false 我一直在读到,+匹配正则表达式的零次或多次出现,因此可能有很多零。在本例中,我只有2个字符,但下一个字符应该是一个数字([0-9]),但在00ff中,它不是一个数字,为什么通过测试 如果你能解释一下,那就太好了。如果你能帮我做我原本想做的事情,那也太好了 我试图制作一个正则表达式,如果数字前面

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

因为
test
将尝试匹配字符串中的某个正则表达式。它不需要匹配整个字符串。在这种情况下,
0+
将与第一个
0
匹配,
[0-9]
将与第二个
0
匹配

如果要强制执行完全匹配,应使用锚定:

/^0+[0-9]$/
  • ^
    -字符串的开头
  • $
    -字符串结尾

至于你的主要任务-我不完全确定这是否是这里要求的,但我假设除了
0
本身之外,不应该有一个以
0
开头的数字序列,
-0
也是不可接受的:

^(?!.*(\D|^)0\d)(?!.*-0).*
这个想法是:

  • ^
    -从字符串开始
  • (?!)
    -(如果内部模式匹配,则匹配失败)
  • *(\D| ^)0\D
    -在一定数量的字符(
    *
    )之后,可能是零,
    (\D| ^)
    -在非数字字符(
    \D
    )或(
    )字符串(
    ^
    )的开头有一个
    0
    ,后面是另一个数字(
    \D
    )。我们这样做是为了确保这个
    0
    是当前数字中的第一个数字
  • *-0
    -失败的另一个条件是,如果在一定数量的字符(
    *
    )之后遇到
    -0
  • *
    -最后,如果匹配没有失败,请匹配该行上的所有字符

您的模式匹配任何零及其后的任何数字。这就是
00f
包含的内容…您想要的是
/^[1-9][0-9]*$/
/^[1-9]0*$/
(不清楚您到底想要什么)。您当前的regexp将匹配任何
0
,后面紧跟一个数字(可能是
0
),从而通过
004
00
,等等。但在
4
400
上失败。只需一个旁注,
+
将匹配1个或多个事件,而不是0个。有趣的是,唯一的问题经常出现(不是)使用锚。也许,regex标记应该包括一个注释:对于完整的字符串匹配,请使用锚(
^
/
$
\a
/
\z
)。感谢您的回答。我想下一次当我想要多次出现时,我会使用锚,我刚刚读到,
+
意味着一次或多次出现,所以我认为它会起作用。在这种情况下它不工作,因为处理器没有遍历整个字符串?它只是找到了第一个出现的地方,锚让它穿过整个事情?类似的东西?@jackblank,它将尝试匹配整个字符串。但是,在它看到它不能完成后,在回溯中(删除最后一个匹配的字符并重试)。重复这个过程,直到有匹配的东西或者没有任何东西可以回溯。但是,使用锚定时,它会立即失败,因为如果它忽略匹配后的最后一个字符,则不会出现以下行尾。问题:
^
符号位于括号内时,表示否定。当它不是时,它意味着字符串的开始。我知道胡萝卜至少有两种含义。我说得对吗?