
本文详解如何使用正则表达式精准判断用户输入字符串是否含有特殊字符(如 !@#$% 等),并据此将字符串分别添加到两个 ArrayList 中,纠正了误用 String.contains() 方法导致匹配失败的常见错误。
本文详解如何使用正则表达式精准判断用户输入字符串是否含有特殊字符(如 `!@#$%` 等),并据此将字符串分别添加到两个 arraylist 中,纠正了误用 `string.contains()` 方法导致匹配失败的常见错误。
在 Java 中,String.contains(CharSequence s) 方法仅用于判断目标字符串是否完整包含指定子串,而非“是否包含其中任意一个字符”。例如,"he!!o".contains("!@#$%^&*()_+") 返回 false,因为该方法试图查找整个 "!@#$%^&*()_+" 这个长字符串作为子串,而非检查其中任一字符是否存在——这正是原代码逻辑错误的核心原因。
要实现“检测字符串中是否出现任意一个预定义特殊字符”,推荐使用 正则表达式匹配。以下为优化后的完整可运行示例:
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Pattern;
public class SpecialCharChecker {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
ArrayList<string> withSpecial = new ArrayList(); // 存含特殊字符的字符串
ArrayList<string> withoutSpecial = new ArrayList(); // 存纯字母数字字符串
System.out.println("请输入密码(输入后按回车):");
String answer = input.nextLine();
// 定义特殊字符集合:使用正则字符类 [] 匹配任意一个字符
Pattern specialPattern = Pattern.compile("[@_!#$%^&*()\[\]{};':"\\|,./?~`]");
if (specialPattern.matcher(answer).find()) {
withSpecial.add(answer);
System.out.println("✅ 包含特殊字符 → 已加入列表:" + withSpecial);
} else {
withoutSpecial.add(answer);
System.out.println("✅ 不含特殊字符 → 已加入列表:" + withoutSpecial);
}
input.close();
}
}</string></string>
? 关键说明与注意事项:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 正则表达式
[...]表示字符类(character class),匹配其中任意一个字符;例如[@!#]可匹配"a!b"中的!。 - 特殊符号如
]、[、、.、?等在正则中有元含义,若需字面匹配,必须转义(如\[、\.)或置于字符类安全位置(如]放在开头或紧邻^后)。上例中\[\]已正确转义方括号。 -
matcher.find()用于查找字符串中是否存在至少一个匹配项,比matches()(要求全串匹配)更符合本场景需求。 - 原代码中存在变量名错误(
System.out.println("without SP" + password);应为answer),已修正。 - 实际应用中建议封装为独立方法(如
hasSpecialChar(String s)),提升复用性与可读性。
✅ 总结:检测单字符存在性,请优先选用正则 Pattern.compile("...").matcher(str).find();切勿依赖 contains() 处理字符集匹配——这是语义与功能的根本差异。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










