Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの正規表現で文字列・行の先頭をマッチングする方法(^の使い方)

Javaの正規表現(Regex)では、メタ文字「^」を使うことで、特定の文字列や行の先頭との一致を判定できます。パターンの冒頭に「^」を置くと、「対象の文字列がそのパターンで始まっているかどうか」を簡単にチェックできます。

「^」(キャレット)の基本

  • ^\\d … 数字で始まる文字列・行に一致します。
  • ^[a-z] … 小文字のアルファベットで始まる文字列・行に一致します。

それでは、具体的なサンプルコードを見ていきましょう。

例1:特殊文字で始まる文字列かどうかを判定する

次の例では、入力された文字列の先頭が英数字や空白以外(つまり記号などの特殊文字)であるかどうかを、Matcherの「matches()」メソッドで判定しています。

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Example {
   public static void main(String args[]) {
      // ユーザーから文字列を入力してもらう
      System.out.println("文字列を入力してください");
      Scanner sc = new Scanner(System.in);
      String input = sc.nextLine();
      // 「先頭が英数字・空白以外」を表す正規表現
      String regex = "^[^a-zA-Z0-9\\s].*";
      // 正規表現をコンパイルしてPatternオブジェクトを作成
      Pattern pattern = Pattern.compile(regex);
      // 対象文字列に対するMatcherオブジェクトを取得
      Matcher matcher = pattern.matcher(input);
      if(matcher.matches()) {
         System.out.println("一致しました");
      } else {
         System.out.println("一致しませんでした");
      }
   }
}

実行結果

文字列を入力してください
#特殊文字で始まる文字列
一致しました

この正規表現「^[^a-zA-Z0-9\\s].*」は、「先頭の1文字が英数字でも空白でもないこと」と、その後に任意の文字が0個以上続くことを意味します。そのため、先頭が「#」のような記号で始まる文字列は一致と判定されます。

例2:複数の文字列から条件に合うものを抽出する

Matcherの「find()」メソッドを使うと、文字列の中にパターンと一致する部分が存在するかどうかを調べられます。次の例では、5つの入力文字列の中からピリオド(.)で終わる文字列だけを抜き出しています。なお、行末との一致にはメタ文字「$」を使用します。「^」と「$」はセットで覚えておくと便利です。

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExample {
   public static void main(String args[]) {
      // 行末のピリオドに一致する正規表現
      String regex = "\\.$";
      Scanner sc = new Scanner(System.in);
      System.out.println("5つの文字列を入力してください:");
      String input[] = new String[5];
      for (int i=0; i<5; i++) {
         input[i] = sc.nextLine();
      }
      // Patternオブジェクトを作成
      Pattern p = Pattern.compile(regex);
      for(int i=0; i<5; i++) {
         // Matcherオブジェクトを作成
         Matcher m = p.matcher(input[i]);
         if(m.find()) {
            System.out.println("文字列" + i + "は「.」で終わっています");
         }
      }
   }
}

実行結果

5つの文字列を入力してください:
hello how are you.
where do you live
what is your name.
welcome to tutorialspoint
The Biggest Online Tutorials Library.
文字列0は「.」で終わっています
文字列2は「.」で終わっています
文字列4は「.」で終わっています

例3:大文字で始まる文字列を判定する

最後に、文字クラス「[A-Z]」と「^」を組み合わせて、先頭が大文字のアルファベットである文字列を判定する例を紹介します。

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExample {
   public static void main(String args[]) {
      // 大文字で始まることを表す正規表現
      String regex = "^[A-Z]";
      Scanner sc = new Scanner(System.in);
      System.out.println("5つの文字列を入力してください:");
      String input[] = new String[5];
      for (int i=0; i<5; i++) {
         input[i] = sc.nextLine();
      }
      // Patternオブジェクトを作成
      Pattern p = Pattern.compile(regex);
      for(int i=0; i<5; i++) {
         // Matcherオブジェクトを作成
         Matcher m = p.matcher(input[i]);
         if(m.find()) {
            System.out.println("文字列" + i + "は大文字で始まっています");
         }
      }
   }
}

実行結果

5つの文字列を入力してください:
Sample text1
sample text2
hello how are you
Welcome to tutorialspoint
Good morning
文字列0は大文字で始まっています
文字列3は大文字で始まっています
文字列4は大文字で始まっています

まとめ

  • メタ文字「^」は、文字列・行の先頭との一致を表します。
  • メタ文字「$」は、文字列・行の末尾との一致を表します。
  • 「Pattern.compile()」で正規表現をコンパイルし、Matcherオブジェクトの「matches()」や「find()」メソッドで判定を行います。
  1. JavaとOpenCVで線を描画する方法をわかりやすく解説

    Java版OpenCVライブラリのorg.opencv.imgprocパッケージには、Imgprocというクラスが含まれています。画像に直線を描画するには、このクラスが提供するline()メソッドを呼び出します。 line()メソッドのパラメータ line()メソッドは、以下のパラメータを受け取ります。 Matオブジェクト ― 直線を描画する対象となる画像を表します。 Pointオブジェクト2つ ― 直線の始点と終点の座標を表します。 Scalarオブジェクト ― 直線の色をBGR形式で指定します。 整数値 ― 直線の太さを指定します(デフォルト値:1)。 サンプルコード 以下は、白紙の画

  2. Java正規表現(RegEx)で任意の文字にマッチさせる方法

    Javaの正規表現におけるメタ文字「.」(ドット)は、任意の1文字にマッチします。マッチ対象はアルファベットでも数字でも、記号などの特殊文字でも構いません。メタ文字「.」の基本「.」は改行文字以外のあらゆる単一文字と一致するため、パターンの柔軟性を高めたい場面で非常に便利です。なお、ドットそのもの(リテラルの「.」)にマッチさせたい場合は、バックスラッシュでエスケープして「\.」と記述します。例1:任意の1文字とのマッチ次のプログラムでは、ユーザーから入力された文字列に対して正規表現「.」を適用し、文字数をカウントしています。import java.util.Scanner; import j