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) を使用して特殊文字を定義する方法を学びます。正規表現は、文字列内のパターンマッチングに強力なツールです。正規表現の特殊文字には特定の意味があり、パターンを定義するために使用されます。

以下は、正規表現で一般的な特殊文字のいくつかです。

  • .: 任意の単一文字に一致します (改行を除く)。
  • *: 直前の要素を 0 回以上一致させます。
  • +: 直前の要素を 1 回以上一致させます。
  • ?: 直前の要素を 0 回または 1 回一致させます。
  • []: 角括弧内の任意の単一文字に一致します。
  • |: OR 演算子として機能します。
  • (): 要素をグループ化します。
  • \: 特殊文字をエスケープし、リテラル文字と一致させます。

たとえば、任意の数字に一致させたい場合は、\d を使用できます。任意の非数字に一致させたい場合は、\D を使用します。同様に、\s は任意の空白文字に一致し、\S は任意の非空白文字に一致します。

特殊文字の正規表現パターンを定義する方法を示すために、簡単な Java プログラムを作成しましょう。

  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 = "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);: この行は、コンパイルされたパターンを使用して入力文字列 (text) に対してマッチ操作を実行するための Matcher オブジェクトを作成します。
    • 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() は入力文字列の「全体」が指定された正規表現に一致するかどうかをチェックします。

このメソッドは、文字列が特定の形式に準拠しているかどうかを検証する場合に便利です。たとえば、パスワードに少なくとも 1 つの特殊文字が含まれているか、ユーザー名が許可された文字のみを含んでいるかをチェックする場合などです。

以前に定義した正規表現に基づいて、文字列に「任意の」特殊文字が含まれているかどうかをチェックするために Pattern.matches() を使用するように、HelloJava.java プログラムを変更しましょう。

  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].* です。これを分解してみましょう。
      • .*: これは任意の文字 (.) を 0 回以上 (*) 一致させます。最初の .* は特殊文字の前の任意の部分に一致します。
      • [^a-zA-Z0-9\\s]: これは前のステップと同じ文字クラスで、単一の特殊文字に一致します。
      • .*: これは任意の文字 (.) を 0 回以上 (*) 一致させます。2 番目の .* は特殊文字の後の任意の部分に一致します。
      • まとめると、.*[^a-zA-Z0-9\\s].* は「文字、数字、または空白文字ではない少なくとも 1 つの文字を含む任意の文字列に一致する」ことを意味します。
    • 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() が 2 番目の文字列に特殊文字 (!) が含まれていることを正しく識別し、1 番目の文字列には含まれていないことを示しています。

文字列中の特殊文字をカウントする

この最後のステップでは、正規表現パターンの定義と Matcher オブジェクトの使用について学んだことを組み合わせて、与えられた文字列中の特殊文字の数をカウントします。これは、データ分析や検証における正規表現の実用的なアプリケーションです。

ステップ 1 と同じ正規表現パターン ([^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() メソッドを使用して文字列内の特殊文字の出現回数をカウントし、一致する部分を反復処理する方法を調べました。