我在JavaScript中有一个正则表达式,允许在电话字段中使用数字和(,.+() -)
字符
我的正则表达式是[0-9-,.+() ]
适用于数字以及六位以上的字符,但它也允许%
和$
等字符不在上面的列表中。
答案 0 :(得分:4)
即使你不必这样做,我也总是能够避免使用元字符(更容易阅读和减少痛苦):
[0-9\-,\.+\(\) ]
但是这不会像你期望的那样工作,因为它只会匹配一个有效字符,同时允许字符串中的其他无效字符。我想你想要将整个字符串与至少一个有效字符匹配:
^[0-9\-,\.\+\(\) ]+$
您的原始正则表达式实际上并不匹配%
。它正在做的是匹配有效字符,但问题是它只匹配一个。因此,如果您使用字符串435%
,则它与4
匹配,因此正则表达式报告它具有匹配项。
如果您尝试将其与一个无效字符匹配,则它将不匹配。因此,您的原始正则表达式与字符串%
:
> /[0-9\-,\.\+\(\) ]/.test("%")
false
> /[0-9\-,\.\+\(\) ]/.test("44%5")
true
> "444%6".match(/[0-9\-,\.+\(\) ]/)
["4"] //notice that the 4 was matched.
回到关于转义的问题,我发现它更容易逃避,而不是担心特定元字符在字符类中有效的不同规则。例如,-
仅在以下情况下有效:
[a-z]
(但不 [z-a]
)[-a]
,[a-]
或[-]
。[0-9-,]
或[a-d-j]
之类的范围时(但请注意[9-,]
无效且[a-d-j]
与e
不匹配字母f
到{{1}})。由于这些原因,我逃避元字符,以明确我想要匹配实际字符本身并消除歧义。
答案 1 :(得分:2)
你只需要锚定你的正则表达式:
^[0-9-,.+() ]+$
在字符类中,除]
和-
外,不需要转义特殊字符。
但是,这些char在以下情况下不会被转义:
]
在char类[]]
中是唯一的
-
位于char类的开始[-abc]
或结尾[abc-]
或最后结束范围[a-c-x]
之后
答案 2 :(得分:-1)
在RegExp中转义具有特殊含义的字符。如果你不确定并且它不是字母字符,那么逃避它通常也不会有害。
如果整个字符串必须匹配,请在RegExp中包含字符串的开始^
和结束$
。
/^[\d\-,\.\+\(\) ]*$/