检查字符串是否包含特殊字符的Java方法



我想写一个Java代码来检查密码是否包括字符,数字和特殊字符。一切都很好,直到特殊字符部分。其思想是,specialChars的索引和Password文件的字符是对立的,如果有匹配,它将打印一条积极的消息,否则它将抛出一个错误。但是它同时返回正面消息和错误消息。不知道为什么。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher; 
import java.util.regex.Pattern;
public class PasswordApp {
public static void main(String[] args) {
String filename = "C:\Users\gabri\Desktop\Generale\Programmazione\Java\Password_Criteria\Fakepassword.txt";
File file = new File(filename);
String Password = null;
try { 
BufferedReader br = new BufferedReader(new FileReader(file));
Password = br.readLine();
br.close();
} catch (FileNotFoundException e) { 
System.out.println("ERROR: File not found: " + filename);
} catch (IOException e) { 
System.out.println("ERROR: Could not read the data: " + filename);
}
// Password valida: ha almeno un numero, una lettera e un carattere speciale
try {
String esitoPositivocarattere = "Carattere incluso.";
String esitoPositivonumero = "Numero incluso.";
String esitoPositivospeciale = "Carattere speciale incluso.";
char[] specialChars = "!@#*+-_(%?/{}[].,;:".toCharArray();
for (int n = 0; n < Password.length(); n++) {
if (Password.substring(n).matches(".*[a-z].*")) {
{
System.out.println(esitoPositivocarattere);
}
} else {
throw new MissingCharacterException();
}
if (Password.substring(n).matches(".*\d.*")) {
System.out.println(esitoPositivonumero);
} else {
throw new MissingNumberException();
}
for (int i = 0; i < specialChars.length; i++) {
if (Password.indexOf(specialChars[i]) > -1) {
System.out.println(esitoPositivospeciale);
} else {
throw new MissingSpecialCharacterException();
}
}
}
} catch (MissingSpecialCharacterException e) {
System.out.println("ERRORE: Manca un carattere speciale.");
} catch (MissingNumberException e) {
System.out.println("ERRORE: Manca un numero.");
} catch (MissingCharacterException e) {
System.out.println("ERRORE: Manca un carattere.");
}
}
}
class MissingSpecialCharacterException extends Exception { 
}
class MissingNumberException extends Exception {
}
class MissingCharacterException extends Exception {
}

假设我的密码是"X3@"它满足特定字符类型的要求。

现在考虑您的密码检查循环,重新格式化以更好地显示逻辑:

for (int i = 0; i < specialChars.length; i++) {
if (Password.indexOf(specialChars[i]) > -1) {
System.out.println(esitoPositivospeciale);
} else {
throw new MissingSpecialCharacterException();
}
}

specialChars的第一个字符是"!"。我的密码不包含"!"所以我们不打印任何东西。相反,我们抛出一个错误,说密码中没有特殊字符,显然是错误的。

因此,您的代码要求密码包含所有特殊字符。你需要重新考虑这个逻辑。

对您所写内容的最小更改是这样的(不一定是最有效的,我只是在这里展示方法):

boolean foundSpecial = false;
for (int i = 0; i < specialChars.length; i++) {
if (Password.indexOf(specialChars[i]) > -1) {
foundSpecial = true;
}
}
if (foundSpecial) {
System.out.println(esitoPositivospeciale);
} else {
throw new MissingSpecialCharacterException();
}

当有"less code"解决问题的方法,你就会有更少的bug。正则表达式在这里是你的朋友:

public boolean passwordValid(String password) {
return password.matches("(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#*+_(%?/{}\[\].,;:-]).*");
}

查看现场演示

分解正则表达式:

  • (?=.*[a-zA-Z])forward表示"一个字母出现在输入
  • 后面的某个地方">
  • (?=.*\d)是forward,意思是"一个数字出现在输入
  • 后面的某个地方"。
  • (?=.*[!@#*+_(%?/{}\[\].,;:-]")是一个forward,意思是"一个‘特殊字符’出现在输入的后面的某个地方"。

注意,连字符被移到字符类的最后一个位置,以避免它被解释为范围

最新更新