Javascript 为什么表达式/0+;[0-9]/通过“测试”;00f"&引用;f";这是一封信
我正在学习rexExp,我有一个: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中,它不是一个数字,为什么通过测试 如果你能解释一下,那就太好了。如果你能帮我做我原本想做的事情,那也太好了 我试图制作一个正则表达式,如果数字前面
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,它将尝试匹配整个字符串。但是,在它看到它不能完成后,在回溯中(删除最后一个匹配的字符并重试)。重复这个过程,直到有匹配的东西或者没有任何东西可以回溯。但是,使用锚定时,它会立即失败,因为如果它忽略匹配后的最后一个字符,则不会出现以下行尾。问题:^
符号位于括号内时,表示否定。当它不是时,它意味着字符串的开始。我知道胡萝卜至少有两种含义。我说得对吗?