如何在 Java 中检查字符串是否包含特殊字符

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何使用正则表达式在 Java 中检查字符串是否包含特殊字符。我们将首先使用正则表达式模式定义特殊字符,了解常见的特殊字符及其用法。

在定义特殊字符之后,你将探索如何使用 Pattern.matches() 方法来有效地确定字符串是否包含任何已定义的特殊字符。最后,你将学习如何统计给定字符串中特殊字符的出现次数,从而全面了解在 Java 中处理特殊字符的方法。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/StringManipulationGroup -.-> java/regex("RegEx") java/SystemandDataProcessingGroup -.-> java/string_methods("String Methods") subgraph Lab Skills java/regex -.-> lab-559981{{"如何在 Java 中检查字符串是否包含特殊字符"}} java/string_methods -.-> lab-559981{{"如何在 Java 中检查字符串是否包含特殊字符"}} end

使用正则表达式定义特殊字符

在这一步中,你将学习如何在 Java 中使用正则表达式(regex)定义特殊字符。正则表达式是用于字符串模式匹配的强大工具。正则表达式中的特殊字符具有特定的含义,用于定义模式。

以下是正则表达式中一些常见的特殊字符:

  • .:匹配任意单个字符(换行符除外)。
  • *:匹配前一个元素零次或多次。
  • +:匹配前一个元素一次或多次。
  • ?:匹配前一个元素零次或一次。
  • []:匹配方括号内的任意单个字符。
  • |:作为逻辑或(OR)运算符。
  • ():将元素分组。
  • \:转义特殊字符,使其匹配字面字符。

例如,如果你想匹配任意数字,可以使用 \d。如果你想匹配任意非数字,则使用 \D。同样,\s 匹配任意空白字符,\S 匹配任意非空白字符。

让我们创建一个简单的 Java 程序,演示如何为特殊字符定义正则表达式模式。

  1. 如果 HelloJava.java 文件尚未在 WebIDE 编辑器中打开,请打开它。

  2. 将文件的全部内容替换为以下代码:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class HelloJava {
        public static void main(String[] args) {
            String text = "Hello! This is a test string with some special characters: @#$%^&*()_+";
            // Define a regex pattern to match special characters
            String regex = "[^a-zA-Z0-9\\s]";
    
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(text);
    
            System.out.println("Original String: " + text);
            System.out.println("Regex Pattern: " + regex);
    
            System.out.print("Special characters found: ");
            while (matcher.find()) {
                System.out.print(matcher.group() + " ");
            }
            System.out.println(); // Print a newline at the end
        }
    }

    让我们来理解这段代码的新部分:

    • import java.util.regex.Matcher;import java.util.regex.Pattern;:这两行导入了在 Java 中处理正则表达式所需的类。
    • String regex = "[^a-zA-Z0-9\\s]";:这行代码定义了我们的正则表达式模式。
      • []:这是一个字符类,表示它将匹配方括号内的任意单个字符。
      • ^:当在字符类的开头使用时([^...]),它会对该类取反,即匹配不在该类中的任意字符。
      • a-zA-Z0-9:这将匹配任意小写字母(a 到 z)、任意大写字母(A 到 Z)或任意数字(0 到 9)。
      • \\s:这将匹配任意空白字符(空格、制表符、换行符等)。我们使用 \\ 是因为 \ 在 Java 字符串中是特殊字符,需要进行转义。
      • 因此,整个模式 [^a-zA-Z0-9\\s] 匹配任何不是字母、数字或空白字符的字符。在这个上下文中,这些就是我们所说的“特殊字符”。
    • Pattern pattern = Pattern.compile(regex);:这行代码将正则表达式模式编译成一个 Pattern 对象。如果多次使用相同的模式,编译模式可以提高性能。
    • Matcher matcher = pattern.matcher(text);:这行代码创建了一个 Matcher 对象,用于使用编译后的模式对输入字符串(text)执行匹配操作。
    • while (matcher.find()):这个循环会查找输入序列中与模式匹配的下一个子序列。
    • matcher.group():这将返回匹配的子序列。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 在终端中使用 javac 命令编译程序:

    javac HelloJava.java
  5. 使用 java 命令运行编译后的程序:

    java HelloJava

    你应该会看到类似于以下的输出:

    Original String: Hello! This is a test string with some special characters: @#$%^&*()_+
    Regex Pattern: [^a-zA-Z0-9\s]
    Special characters found: ! : @ ## $ % ^ & * ( ) _ +

你已经成功定义了一个用于识别特殊字符的正则表达式模式,并在 Java 程序中使用了它。

使用 Pattern.matches() 检查特殊字符

在这一步中,我们将探索在 Java 中使用正则表达式的另一种方法:Pattern.matches() 方法。与上一步中用于查找模式所有匹配项的 Matcher 对象不同,Pattern.matches() 用于检查整个输入字符串是否与给定的正则表达式匹配。

当你需要验证字符串是否符合特定格式时,这个方法非常有用,例如检查密码是否至少包含一个特殊字符,或者用户名是否仅包含允许的字符。

让我们修改 HelloJava.java 程序,使用 Pattern.matches() 方法根据之前定义的正则表达式来检查字符串是否包含任何特殊字符。

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。

  2. 将现有代码替换为以下代码:

    import java.util.regex.Pattern;
    
    public class HelloJava {
        public static void main(String[] args) {
            String text1 = "Hello World";
            String text2 = "Hello World!";
            // Define a regex pattern to check for the presence of special characters
            // This pattern checks if the string contains at least one character that is NOT a letter, digit, or whitespace
            String regex = ".*[^a-zA-Z0-9\\s].*";
    
            boolean containsSpecial1 = Pattern.matches(regex, text1);
            boolean containsSpecial2 = Pattern.matches(regex, text2);
    
            System.out.println("String 1: \"" + text1 + "\"");
            System.out.println("Contains special characters? " + containsSpecial1);
    
            System.out.println("String 2: \"" + text2 + "\"");
            System.out.println("Contains special characters? " + containsSpecial2);
        }
    }

    让我们看看代码的改动之处:

    • 对于这个方法,我们只需要导入 java.util.regex.Pattern;
    • 现在的正则表达式模式是 .*[^a-zA-Z0-9\\s].*。下面来详细分析一下:
      • .*:这表示匹配任意字符(.)零次或多次(*)。第一个 .* 用于匹配特殊字符之前的任意内容。
      • [^a-zA-Z0-9\\s]:这与上一步中的字符类相同,用于匹配单个特殊字符。
      • .*:同样表示匹配任意字符(.)零次或多次(*)。第二个 .* 用于匹配特殊字符之后的任意内容。
      • 综合起来,.*[^a-zA-Z0-9\\s].* 的意思是“匹配任何包含至少一个非字母、非数字且非空白字符的字符串”。
    • Pattern.matches(regex, text1):这是 Pattern 类的静态方法,它接受正则表达式模式和输入字符串作为参数。如果整个字符串与模式匹配,则返回 true,否则返回 false
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 编译程序:

    javac HelloJava.java
  5. 运行程序:

    java HelloJava

    你应该会看到以下输出:

    String 1: "Hello World"
    Contains special characters? false
    String 2: "Hello World!"
    Contains special characters? true

这个输出表明,Pattern.matches() 方法正确识别出第二个字符串包含特殊字符(!),而第一个字符串不包含。

统计字符串中的特殊字符数量

在这最后一步,我们将结合之前所学的定义正则表达式模式和使用 Matcher 对象的知识,来统计给定字符串中特殊字符的数量。这是正则表达式在数据分析或验证方面的一个实际应用。

我们将使用第一步中的相同正则表达式模式 ([^a-zA-Z0-9\\s]) 来识别特殊字符,并使用 Matcher 遍历字符串,统计模式匹配的次数。

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。

  2. 将现有代码替换为以下代码:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class HelloJava {
        public static void main(String[] args) {
            String text = "This string has 5 special characters: !@#$%";
            // Define a regex pattern to match special characters
            String regex = "[^a-zA-Z0-9\\s]";
    
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(text);
    
            int count = 0;
            while (matcher.find()) {
                count++;
            }
    
            System.out.println("Original String: \"" + text + "\"");
            System.out.println("Regex Pattern: " + regex);
            System.out.println("Number of special characters found: " + count);
        }
    }

    下面是新代码的执行过程:

    • 我们再次导入 MatcherPattern 类。
    • 我们使用相同的正则表达式模式 [^a-zA-Z0-9\\s] 来匹配单个特殊字符。
    • 我们将整数变量 count 初始化为 0。
    • while (matcher.find()) 循环遍历字符串,每次 matcher.find() 方法找到模式匹配时,就会执行循环内的代码。
    • 在循环内部,每找到一个特殊字符,我们就将 count 变量加 1。
    • 最后,我们打印出特殊字符的总数。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 编译程序:

    javac HelloJava.java
  5. 运行程序:

    java HelloJava

    你应该会看到以下输出:

    Original String: "This string has 5 special characters: !@#$%"
    Regex Pattern: [^a-zA-Z0-9\s]
    Number of special characters found: 5

输出正确显示了给定字符串中有 5 个特殊字符。你已经成功使用正则表达式和 Matcher 对象统计了字符串中特定字符的数量。

总结

在本次实验中,我们学习了如何在 Java 中使用正则表达式(regex)来定义特殊字符。我们探究了常见的正则表达式特殊字符及其含义,例如 .*+?[]|()\。我们还了解了如何使用预定义的字符类,如 \d\D\s\S

接着,我们学习了如何使用 Pattern.matches() 方法,根据定义好的正则表达式模式来检查字符串是否包含特殊字符。最后,我们探讨了如何使用 Matcher.find() 方法并遍历匹配项,来统计字符串中特殊字符的出现次数。