开发JavaScript正则表达式,我们发现了一些奇怪的行为。
对于以下模式:[\'-=]
接受角色*
。 ('
,-
,=
也被接受,但这是预期的。)
我们可以用任何字符替换'='。如果我们更改模式字符顺序,它就不再起作用了。
有人对此有所了解吗?
答案 0 :(得分:10)
模式中间的“ - ”字符是造成问题的原因。 “ - ”字符在这样的字符组中是特殊的,它意味着“所有字符之间”。因此,“' - =”表示“所有字符来自”“到”=“。”恰好“*”在该范围内。
要修复它,请重新排序字符列表,以便“ - ”结尾,或者用反斜杠引用它。
答案 1 :(得分:5)
因为在这种情况下-
表示范围。在ASCII表中,*
位于'
和=
之间。您的pattenr还将匹配'
和=
之间的所有其他字符(例如数字)。您可以找到所有ASCII字符here
如果您想匹配'
=
或-
,您应该逃避减号。使用此模式:[\'\-=]
答案 2 :(得分:4)
- char在regexp中的char序列中具有特殊含义。
它会创建一个范围
[\' - =]表示接受\和'和=
之间的所有字符指定 - 在char序列中,你必须把它放在最后
[\'= - ]将会有所期待。
答案 3 :(得分:4)
我认为这是因为你必须逃避' - ',否则它的范围(如[A-Z])。
答案 4 :(得分:4)
-
字符用于指定集合中的范围,例如[a-z]
。您的设置会匹配'
到=
中的所有字符,即所有字符'()*+,-./0123456789:;<=
。
你必须逃避-
才能按字面意思使用它:
[\'\-=]