Java正则过滤特殊字符案例如何用

wen java案例 25

本文目录导读:

Java正则过滤特殊字符案例如何用

  1. 基础过滤方法
  2. 更全面的过滤例子
  3. 使用 Pattern 和 Matcher
  4. 实际应用案例 - 表单输入过滤
  5. 常用正则表达式汇总
  6. 关键要点:

在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));
    }
}

关键要点:

  1. 表示匹配不在集合中的字符
  2. \\w 表示单词字符(字母、数字、下划线)
  3. \\s 表示空白字符(空格、制表符等)
  4. \\u4e00-\\u9fa5 表示中文字符范围
  5. replaceAll() 用空字符串替换匹配到的内容

根据你的具体需求选择合适的过滤规则,可以灵活组合不同的字符集。

抱歉,评论功能暂时关闭!