我在 JavaScript 中有一个正则表达式,允许(,.+() -)
在电话字段中使用数字和字符
我的正则表达式是[0-9-,.+() ]
它适用于数字以及以上六个字符,但它也允许类似%
和$
不在上面列表中的字符。
我在 JavaScript 中有一个正则表达式,允许(,.+() -)
在电话字段中使用数字和字符
我的正则表达式是[0-9-,.+() ]
它适用于数字以及以上六个字符,但它也允许类似%
和$
不在上面列表中的字符。
即使您不必这样做,我也总是强调转义元字符(更易于阅读且更少痛苦):
[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
由于这些原因,我对元字符进行转义以表明我想匹配实际字符本身并消除歧义。
你只需要锚定你的正则表达式:
^[0-9-,.+() ]+$
在字符类中,特殊字符不需要转义,除了 ]
and -
。
但是,这些字符在以下情况下不会被转义:
]
在 char 类中是单独的 在 char 类[]]
-
的开头[-abc]
或结尾[abc-]
处或在最后一个结束范围之后[a-c-x]
在您的正则表达式中转义具有特殊含义的字符。如果您不确定并且它不是字母字符,那么逃避它通常也没有什么坏处。
如果整个字符串必须匹配,请在 RegExp 中也包含字符串的开头^
和结尾$
。
/^[\d\-,\.\+\(\) ]*$/