Java正则表达式模式不像上面提到的那样工作

时间:2014-10-06 15:05:58

标签: java regex

我想在字符串中只允许使用字母数字值和几个特殊字符。

正则表达式 [a-zA-Z0-9[@#%&\\s]]

当我尝试使用Matcher.find()时,它说的是真的,即使我在字符串中使用了其他特殊字符。例如: welcome123^456 。它应该是假的(不匹配)。

当我使用String.matches()时,即使对于正确的模式,它也是假的。例如: welcomeAA123@ 。它应该成真。但我变得虚假。

以下是我希望允许的唯一5个特殊字符以及Alpha +数字。 @#$%&

对于Ex: welcome123# - 应该成真 welcome123 $ - 应该成真 welcome123_ - 应该是假的(因为不允许使用下划线。)
欢迎$ @ - 应该成真 1234 $ @ - 应该成真

2 个答案:

答案 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尝试查找与模式匹配的子字符串。