在regex模式中需要帮助,它排除了android中的特殊字符



我想要一个正则表达式,它限制用户在android中接受特殊字符。

我试过这个:

!phoneNumber.matches("[/,'*:<>!~@#$%^&()+=?()"|![#$-]")

但无论电话号码是否包含特殊字符,它总是返回CCD_。

正则表达式[/,'*:<>!~@#$%^&()+=?()"|![#$-]匹配任何一个出现一次的列出字符,其否定也匹配。因此,无论是a还是aaa,!phoneNumber.matches("[/,'*:<>!~@#$%^&()+=?()"|![#$-]")都评估为trueaaa不是指定字符中的一个。只有评估为false的大小写才会出现任何一个字符

您必须只接受这些字符以外的字符。为此,应该在字符类的左括号([)后面使用^,并在右括号后面添加+。此正则表达式匹配所列字符以外的任何一个或多个字符。

所需的正则表达式将是"[^/,'*:<>!~@#$%^&()+=?()"|!\[#$-]+",它将模式与一个或多个字符相匹配。

注意:您的实现似乎是用java实现的。此正则表达式适用于java

还有一件事:为什么添加"而不是"?若要在字符串中转义true0,您不能只给出[,但我认为需要\[

由于您似乎正在匹配一个电话号码(并且对电话号码的定义非常有限),我建议使用阳性测试而不是阴性测试:

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代码)

最新更新