我想要一个正则表达式,它限制用户在android中接受特殊字符。
我试过这个:
!phoneNumber.matches("[/,'*:<>!~@#$%^&()+=?()"|![#$-]")
但无论电话号码是否包含特殊字符,它总是返回CCD_。
正则表达式[/,'*:<>!~@#$%^&()+=?()"|![#$-]
匹配任何一个出现一次的列出字符,其否定也匹配。因此,无论是a还是aa或a,!phoneNumber.matches("[/,'*:<>!~@#$%^&()+=?()"|![#$-]")
都评估为true为aa和a不是指定字符中的一个。只有评估为false的大小写才会出现任何一个字符。
您必须只接受这些字符以外的字符。为此,应该在字符类的左括号([
)后面使用^
,并在右括号后面添加+
。此正则表达式匹配所列字符以外的任何一个或多个字符。
所需的正则表达式将是"[^/,'*:<>!~@#$%^&()+=?()"|!\[#$-]+"
,它将模式与一个或多个字符相匹配。
注意:您的实现似乎是用java实现的。此正则表达式适用于java。
还有一件事:为什么添加"
而不是"
?若要在字符串中转义true
0,您不能只给出[
,但我认为需要\[
。
由于您似乎正在匹配一个电话号码(并且对电话号码的定义非常有限),我建议使用阳性测试而不是阴性测试:
phoneNumber.matches("[\d\s]+")
如果字段只包含数字和空格,则返回true(通常我会允许在电话号码中使用其他字符,至少是()-+
,但您已将这些字符排除为特殊字符,因此我保持一致)。
这要简单得多,并且将从字段中排除所有无效字符。
你可能还想超越这一点,并确保它是一个有效的电话号码格式,以及。这将取决于你想要匹配的电话号码类型。
这是我的regex变体的一个特殊字符验证器:
String regExp = "^[^<>{}"/|;:.,~!?@#$%^=&*\]\\()\[¿§«»ω⊙¤°℃℉€¥£¢¡®©0-9_+]*$";
Pattern pattern = Pattern.compile(regExp, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
return matcher.matches();
(Java代码)