我想在字符串中只允许使用字母数字值和几个特殊字符。
正则表达式 [a-zA-Z0-9[@#%&\\s]]
当我尝试使用Matcher.find()时,它说的是真的,即使我在字符串中使用了其他特殊字符。例如: welcome123^456
。它应该是假的(不匹配)。
当我使用String.matches()时,即使对于正确的模式,它也是假的。例如: welcomeAA123@
。它应该成真。但我变得虚假。
以下是我希望允许的唯一5个特殊字符以及Alpha +数字。 @#$%&
对于Ex:
welcome123# - 应该成真
welcome123 $ - 应该成真
welcome123_ - 应该是假的(因为不允许使用下划线。)
欢迎$ @ - 应该成真
1234 $ @ - 应该成真
答案 0 :(得分:1)
我认为问题是嵌套方括号的使用,它为你提供了一个联合字符类(参见docs)。也就是说,[a-zA-Z0-9[@#%&\s]]
将与 String
匹配,包含大写和小写的字母数字字符,或只包含String
列出的特殊字符。
您的模式也匹配定义的类的单个字符 - 您需要使用+
之类的内容来匹配一个长度超过一个字符的字符串。
如果你想在允许的字符中包含方括号,你应该将它们转义,否则你就不应该嵌套你的字符类
"welcomeAA123@".matches("[a-zA-Z0-9@#%&\\s\\[\\]]+") //true
"welcome123^456".matches("[a-zA-Z0-9@#%&\\s\\[\\]]+") //false
"welcomeAA123@".matches("[a-zA-Z0-9@#%&\\s]+") //true
"welcome123^456".matches("[a-zA-Z0-9@#%&\\s]+") //false
"welcomeAA123[@]".matches("[a-zA-Z0-9@#%&\\s\\[\\]]+") //true
"welcomeAA123[@]".matches("[a-zA-Z0-9@#%&\\s]+") //false
答案 1 :(得分:0)
你缺少量词和锚点:
^[a-zA-Z0-9[@#%&\\s\\]]+$
另外:如果整个字符串与给定模式匹配,则匹配返回true。 find尝试查找与模式匹配的子字符串。