可能重复:
JAVA: check a string if there is a special character in it
我正在尝试创建一种方法来检查密码是否以特殊字符开头或结尾。我设法编写了一些其他检查,但这看起来有点复杂。
我认为我需要使用正则表达式来有效地执行此操作。我已经创建了一个方法来检查是否有任何特殊字符,但我无法弄清楚如何修改它。
Pattern p = Pattern.compile("\\p{Punct}");
Matcher m = p.matcher(password);
boolean a = m.find();
if (!a)
System.out.println("Password must contain at least one special character!");
根据我正在阅读的书,我需要在模式中使用^和$来检查它是以特殊字符开头还是结尾。我可以将两个语句添加到现有模式中,或者我应该如何开始解决这个问题?
修改
好吧,我认为我的非正则表达式工作正常:
for (int i = 0; i < password.length(); i++) {
if (SPECIAL_CHARACTERS.indexOf(password.charAt(i)) > 0)
specialCharSum++;
}
答案 0 :(得分:5)
你不能只使用charAt获取角色,indexOf来检查角色是否特殊吗?
final String SPECIAL_CHARACTERS = "?#"; // And others
if (SPECIAL_CHARACTERS.indexOf(password.charAt(0)) >= 0
|| SPECIAL_CHARACTERS.indexOf(password.charAt(password.length() - 1)) >= 0) {
System.out.println("password begins or ends with a special character");
}
我没有分析(分析是性能的黄金法则),但我希望迭代编译时常量字符串比构建和执行正则表达式的有限状态自动机更快。此外,Java的正则表达式比FSA更复杂,所以我希望Java正则表达式的实现方式不同,因此比FSA慢。
答案 1 :(得分:4)
最简单的方法是分组或分组。
Pattern p = Pattern.compile("(^\\p{Punct})|(\\p{Punct}$)");
Matcher m = p.matcher(password);
boolean a = m.find();
if (!a)
System.out.println("Password must contain at least one special character at the beginning or end!");
答案 2 :(得分:3)
使用此模式:
"^\\p{Punct}|\\p{Punct}$"
^\\p{Punct}
=“字符串的开头,后跟一个标点符号|
=“或”\\p{Punct}$
=“标点字符,后跟字符串结尾”