複数の文字列のいずれかにマッチするパターンを記述する

正規表現では文字列の選択肢をいくつか記述しておき、その中のいずれかに一致した場合にマッチするパターンを定義することができます。ここでは Java の正規表現で複数の文字列のいずれかにマッチするパターンを記述する方法について解説します。

(Last modified: )

複数の文字列のいずれかにマッチ(|)

メタ文字のひとつである縦棒(|)は複数の文字列のいずれか一つに一致する文字列にマッチします。文字列の候補を縦棒(|)で区切って記述します。

文字列|文字列|...

例えば次のようなパターンは Sunday か Sun か sunday に一致する文字列にマッチします。

String regex = "Sunday|Sun|sunday";

Sunday か Sun か sunday にマッチします。前後に他のパターンがないので、これらのいずれかの文字列が含まれる文字列にもマッチします。

〇 Go out on sunday
〇 Today is SundaySunflowers are in bloom

実際にサンプルで試してみます。

import java.util.regex.*;

class JSample12_1{
  public static void main(String[] args){
    String regex = "blue|Blue";
    Pattern p = Pattern.compile(regex);

    Matcher m1 = p.matcher("My favorite color is blue");
    System.out.println(m1.find());  // true

    Matcher m2 = p.matcher("bluebird weather");
    System.out.println(m2.find());  // true

    Matcher m3 = p.matcher("Cobalt BLUE");
    System.out.println(m3.find());  // false
  }
}

パターンは blue または Blue とマッチします。 BLUE にはマッチしません。

複数の選択肢を括弧で囲んでグループ化する

複数の文字列の選択肢のいずれかにマッチするパターンを記述する場合、前後に別のパターンと組み合わせる場合、そのまま記述することができません。例えば A で始まり、 Red か red のどちらかが続き、 最後に B が続く文字列とマッチするパターンを考える場合、次のように書いてしまうと ARed か redB かの選択となってしまいます。

String regex = "ARed|redB";

そこで選択肢の部分を括弧()で囲んでグループ化します。グループ化することでどこからどこまでが選択肢の部分なのかを明確にすることができます。

String regex = "A(Red|red)B";

この場合 ARedB または AredB のどちらかにマッチします。

ARedBAredB
✕ AREDB

実際にサンプルで試してみます。

import java.util.regex.*;

class JSample12_2{
  public static void main(String[] args){
    String regex = "\\b(blue|Blue)\\b";
    Pattern p = Pattern.compile(regex);

    Matcher m1 = p.matcher("Border Color is Blue");
    System.out.println(m1.find());  // true

    Matcher m2 = p.matcher("My favorite color is LightBlue");
    System.out.println(m2.find());  // false

    Matcher m3 = p.matcher("blue cheese");
    System.out.println(m3.find());  // true

    Matcher m4 = p.matcher("bluebird weather");
    System.out.println(m4.find());  // false
  }
}

パターンは単語境界で始まり、 blue または Blue のどちらかが続き、最後にまた単語境界が続く文字列とマッチします。

選択肢を他のメタ文字を組み合わせて指定する

選択の中に記述する候補には Yes|No のような文字列だけではなく、他のメタ文字を組み合わせて記述できます。

String regex = "A+|B+";

この場合 A が 1 回以上続く AA や AAAA または B が 1 回以上続く BBB や BBBBB のいずれかにマッチします。

ABBBB

実際にサンプルで試してみます。

import java.util.regex.*;

class JSample12_3{
  public static void main(String[] args){
    String regex = "<[0-3]{3}>|<[0-7]{4}>";
    Pattern p = Pattern.compile(regex);

    Matcher m1 = p.matcher("<012>");
    System.out.println(m1.find());

    Matcher m2 = p.matcher("<0246>");
    System.out.println(m2.find());
  }
}

パターンは 0 から 3 までの数値が 3 つ並んだ文字列、または 0 から 7 までの数値が 4 つ並んだ文字列、のどちらかとマッチします。

-- --

Java の正規表現で複数の文字列のいずれかにマッチするパターンを記述する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。