本文目录导读:

在Java中使用正则表达式过滤特殊字符,有几种常见的方法,以下是完整的案例说明:
基础过滤方法
使用 replaceAll() 方法
public class SpecialCharFilter {
// 保留字母、数字、中文和常见标点
public static String filterBasic(String str) {
if (str == null) return null;
// \\s 空格, \\w 单词字符(字母数字下划线), 中文范围
return str.replaceAll("[^\\w\\s\\u4e00-\\u9fa5.,!?;:'\"()()【】]", "");
}
public static void main(String[] args) {
String testStr = "Hello! 你好@#¥%……&*() World?【】{}";
String result = filterBasic(testStr);
System.out.println("原始字符串: " + testStr);
System.out.println("过滤后字符串: " + result);
}
}
更全面的过滤例子
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SpecialCharFilterDemo {
/**
* 只保留字母、数字、中文和基本标点
*/
public static String filterSpecialChars(String input) {
if (input == null || input.isEmpty()) return input;
// 定义允许保留的字符
String regex = "[^" +
"a-zA-Z" + // 英文字母
"0-9" + // 数字
"\\u4e00-\\u9fa5" + // 中文字符
"\\s" + // 空格
"_" + // 下划线
".,!?;:'\"()()【】" + // 常见标点
"]";
return input.replaceAll(regex, "");
}
/**
* 完全过滤所有特殊字符,只保留文字
*/
public static String removeAllSpecialChars(String input) {
if (input == null || input.isEmpty()) return input;
// 只保留字母、数字、中文和空格
String regex = "[^a-zA-Z0-9\\u4e00-\\u9fa5\\s]";
return input.replaceAll(regex, "");
}
public static void main(String[] args) {
// 测试数据
String[] testCases = {
"Hello! 你好@#¥%……&* World?",
"测试123ABC_英文-中文-标点。,!",
"邮箱: test@example.com (123)",
"电话号码: 138-0013-8000",
"特殊字符: ~!@#$%^&*()_+{}|:\"<>?",
"HTML标签: <div>内容</div>"
};
System.out.println("=== 过滤特殊字符测试 ===\n");
for (String test : testCases) {
System.out.println("原始: " + test);
System.out.println("基础过滤: " + filterSpecialChars(test));
System.out.println("完全过滤: " + removeAllSpecialChars(test));
System.out.println("---");
}
}
}
使用 Pattern 和 Matcher
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class AdvancedFilterDemo {
/**
* 使用Pattern.compile()预编译正则表达式
*/
private static final Pattern SPECIAL_CHARS_PATTERN =
Pattern.compile("[^a-zA-Z0-9\\u4e00-\\u9fa5\\s]");
public static String advancedFilter(String input) {
if (input == null) return null;
Matcher matcher = SPECIAL_CHARS_PATTERN.matcher(input);
return matcher.replaceAll("");
}
/**
* 自定义过滤规则 - 替换为指定字符
*/
public static String replaceWithChar(String input, String replacement) {
if (input == null) return null;
Pattern pattern = Pattern.compile("[^\\w\\s\\u4e00-\\u9fa5]");
return pattern.matcher(input).replaceAll(replacement);
}
public static void main(String[] args) {
String testStr = "Hello! 你好@#¥%……&* World?【】{}";
System.out.println("原始: " + testStr);
System.out.println("直接过滤: " + advancedFilter(testStr));
System.out.println("替换为空格: " + replaceWithChar(testStr, " "));
System.out.println("替换为*号: " + replaceWithChar(testStr, "*"));
}
}
实际应用案例 - 表单输入过滤
public class InputValidator {
/**
* 过滤用户输入,防止XSS攻击
*/
public static String sanitizeUserInput(String input) {
if (input == null || input.isEmpty()) return input;
// 1. 过滤HTML标签
String clean = input.replaceAll("<[^>]*>", "");
// 2. 过滤特殊字符(允许的基本字符)
clean = clean.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5\\s.,!?;:()()【】]", "");
// 3. 去除多余空格
clean = clean.trim().replaceAll("\\s+", " ");
return clean;
}
/**
* 用户名过滤(只允许字母、数字、中文和下划线)
*/
public static String filterUsername(String username) {
if (username == null) return null;
return username.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5_]", "");
}
/**
* 手机号过滤(只保留数字)
*/
public static String filterPhoneNumber(String phone) {
if (phone == null) return null;
return phone.replaceAll("[^0-9]", "");
}
public static void main(String[] args) {
// 模拟用户输入
String userInput = "<script>alert('XSS')</script>Hello! 电话: 138-0013-8000#¥%……&*";
String username = "张三@#$%^&李四_nice";
String phone = "138-0013-8000 ext.123";
System.out.println("输入过滤: " + sanitizeUserInput(userInput));
System.out.println("用户名过滤: " + filterUsername(username));
System.out.println("手机号过滤: " + filterPhoneNumber(phone));
}
}
常用正则表达式汇总
public class RegexPatterns {
// 常用正则表达式常量
public static final String ONLY_LETTERS = "[^a-zA-Z]"; // 只保留字母
public static final String ONLY_NUMBERS = "[^0-9]"; // 只保留数字
public static final String LETTERS_NUMBERS = "[^a-zA-Z0-9]"; // 只保留字母和数字
public static final String CHINESE_CHARS = "[^\\u4e00-\\u9fa5]"; // 只保留中文
public static final String CHINESE_LETTERS = "[^a-zA-Z\\u4e00-\\u9fa5]"; // 中文和英文
/**
* 通用过滤方法
*/
public static String filter(String input, String regex) {
if (input == null) return null;
return input.replaceAll(regex, "");
}
public static void main(String[] args) {
String test = "Hello123你好!@#¥%……&*";
System.out.println("原字符串: " + test);
System.out.println("只保留字母: " + filter(test, ONLY_LETTERS));
System.out.println("只保留数字: " + filter(test, ONLY_NUMBERS));
System.out.println("字母和数字: " + filter(test, LETTERS_NUMBERS));
System.out.println("只保留中文: " + filter(test, CHINESE_CHARS));
System.out.println("中英文: " + filter(test, CHINESE_LETTERS));
}
}
关键要点:
- 表示匹配不在集合中的字符
\\w表示单词字符(字母、数字、下划线)\\s表示空白字符(空格、制表符等)\\u4e00-\\u9fa5表示中文字符范围replaceAll()用空字符串替换匹配到的内容
根据你的具体需求选择合适的过滤规则,可以灵活组合不同的字符集。