|
|
複数の候補から選択 |
H.Kamifuji . |
複数の候補を併記し、いずれかに一致する時にマッチするようなパターンの作成方法を確認します。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
いくつかの候補となる文字列を列挙し、そのいずれか一致する場合にマッチするパターンの記述方法を確認します。書式は次の通りです。 書式は次の通りです。 "候補1|候補2|.."候補となる文字列をハイフン(|)で区切って続けて記述します。具体的な例として"Friday"、"Saturday"、"Sunday"のいずれかにマッチする正規表現は次のように記述します。 "Friday|Saturday|Sunday"ターゲット文字列毎にこのパターンがマッチするかどうかを次に例として記述します。 ○ Saturday ○ Today is Friday ○ Sunday's menu × Tuesdayこのように複数の候補のいずれかに一致するパターンを定義することが簡単にできます。 具体的には次のように記述します。 String str = "Document created by 20090801"; String regex = "2007|2008|2009"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); if (m.find()){ System.out.println("マッチしました"); }else{ System.out.println("マッチしません"); }上記の場合はマッチします。 他の文字列と組み合わせ選択を使用する場合に、他の文字と組み合わせる場合を考えてみます。"bordecolor red|blue|yerllow"上記は"bordecolor red"、"bordecolor blue"、"bordecolor yerllow"のいずれかに一致するようなパターンを作成したつもりでしたが実際には"bordecolor red"、"blue"、"yerllow"のいずれかに一致する場合にマッチします。つまり「bordecolor red」「blue」「yerllow」という3つの候補のいずれかに一致するパターンを作成していることになります。 このように選択と他のパターンを組み合わせる場合には、どの部分が選択の候補として記述されているのかを明確にするために、選択の全体を括弧()で囲んで下さい。 "(候補1|候補2|..)"よって先ほどの場合は次のように記述することで意図したとおりのパターンとなります。 "bordecolor (red|blue|yerllow)"上記は"bordecolor red"、"bordecolor blue"、"bordecolor yerllow"のいずれかがターゲット文字列に含まれている場合にマッチします。 では実際に試してみます。 サンプルプログラム下記のサンプルを実行してみよう。import java.util.regex.Pattern; import java.util.regex.Matcher; class JSample1_1{ public static void main(String args[]){ String str1 = "2009.07.01"; String str2 = "1995年04月02日"; String str3 = "08/04/2007"; String str4 = "99/11/25"; String regex1 = "2007|2008|2009"; Pattern p1 = Pattern.compile(regex1); String regex2 = "200|199"; Pattern p2 = Pattern.compile(regex2); System.out.println("パターン : " + regex1); check(p1, str1); check(p1, str2); check(p1, str3); check(p1, str4); System.out.println("パターン : " + regex2); check(p2, str1); check(p2, str2); check(p2, str3); check(p2, str4); } private static void check(Pattern p, String target){ Matcher m = p.matcher(target); if (m.find()){ System.out.println("○ " + target + " [" + m.group() + "]"); }else{ System.out.println("× " + target); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Select]$ javac JSample1_1.java [xxxxxxxx@dddddddddd Select]$ java JSample1_1 パターン : 2007|2008|2009 ○ 2009.07.01 [2009] × 1995年04月02日 ○ 08/04/2007 [2007] × 99/11/25 パターン : 200|199 ○ 2009.07.01 [200] ○ 1995年04月02日 [199] ○ 08/04/2007 [200] × 99/11/25 [xxxxxxxx@dddddddddd Select]$ |
量指定子である"+"や"*"は選択に対しても適用することができます。その場合、選択の候補のいずれかが繰り返し現れるパターンを定義することが可能です。(量指定子に関しては「任意の文字と繰り返し(量指定子)」を参照して下さい)。 書式は次の通りです。 "(候補1|候補2|..)+" "(候補1|候補2|..)*"具体的な例で考えてみます。 "(Yes|No)+"メタ文字の"+"は直前の文字を1回以上繰り返す文字列にマッチします。今回は繰り返しの対象となるものが選択となっていますので、"Yes"か"No"が1回以上繰り返す文字列にマッチするパターンとなっています。 では"s(Yes|No)+e"というパターンがターゲット文字列毎にマッチするかどうかを次に例として記述します。 ○ sYese ○ sNoe ○ sYesNoYese × sYesnoeこのように選択に対して繰り返しのメタ文字を指定することで、選択の中の同じ候補が繰り返されるだけではなく、複数の候補のいずれかが繰り返し現れる場合にマッチするパターンを定義することが出来ます。 具体的には次のように記述します。 String str = "No0010101001."; String regex = "No(0|1)+."; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); if (m.find()){ System.out.println("マッチしました"); }else{ System.out.println("マッチしません"); }上記の場合はマッチします。 では実際に試してみます。 サンプルプログラム下記のサンプルを実行してみよう。import java.util.regex.Pattern; import java.util.regex.Matcher; class JSample2_1{ public static void main(String args[]){ String str1 = "No01 is Apple"; String str2 = "No12506 is Melon"; String str3 = "No.01 is Banana"; String str4 = "No12.5 is Lemon"; String regex = "No(0|1|2|3|4|5|6|7|8|9)+ is"; Pattern p = Pattern.compile(regex); System.out.println("パターン : " + regex); check(p, str1); check(p, str2); check(p, str3); check(p, str4); } private static void check(Pattern p, String target){ Matcher m = p.matcher(target); if (m.find()){ System.out.println("○ " + target + " [" + m.group() + "]" ); }else{ System.out.println("× " + target); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Select]$ javac JSample2_1.java [xxxxxxxx@dddddddddd Select]$ java JSample2_1 パターン : No(0|1|2|3|4|5|6|7|8|9)+ is ○ No01 is Apple [No01 is] ○ No12506 is Melon [No12506 is] × No.01 is Banana × No12.5 is Lemon [xxxxxxxx@dddddddddd Select]$ |
選択の中に記述する候補には"(Yes|No)"などのように単なる文字列だけではなく、他のメタ文字を記述することも可能です。 具体的な例で考えてみます。 "(a.+\[|b.+\[)"上記は2つの候補が記述された選択です。1つ目の候補は"a.+\["、2つ目の候補は"b.+\["です。"["は正規表現では特別な意味を持つためエスケープ処理して"\["と記述しています。 "a.+["は"a"で始まり、任意の文字が1文字以上続いた後に"["が出現する文字列にマッチします。 "b.+["は"b"で始まり、任意の文字が1文字以上続いた後に"["が出現する文字列にマッチします。そしてパターン全体としてはこの候補のいずれかが出現する文字列にマッチすることになります。 ターゲット文字列毎にマッチするかどうかを次に例として記述します。 ○ abc[10] ○ border[9] × array × coin[7]このように候補も単なる文字列だけではなく他のメタ文字などを組み合わせて記述することが可能です。 具体的には次のように記述します。 String str = "array[10]."; String regex = "(a.+\\[|b.+\\[)"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); if (m.find()){ System.out.println("マッチしました"); }else{ System.out.println("マッチしません"); }上記の場合はマッチします。 では実際に試してみます。 サンプルプログラム下記のサンプルを実行してみよう。import java.util.regex.Pattern; import java.util.regex.Matcher; class JSample3_1{ public static void main(String args[]){ String str1 = "abc[10]"; String str2 = "border[9]"; String str3 = "array"; String str4 = "coin[7]"; String regex = "(a.+\\[|b.+\\[)"; Pattern p = Pattern.compile(regex); System.out.println("パターン : " + regex); check(p, str1); check(p, str2); check(p, str3); check(p, str4); } private static void check(Pattern p, String target){ Matcher m = p.matcher(target); if (m.find()){ System.out.println("○ " + target + " <" + m.group() + ">" ); }else{ System.out.println("× " + target); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Select]$ javac JSample3_1.java [xxxxxxxx@dddddddddd Select]$ java JSample3_1 パターン : (a.+\[|b.+\[) ○ abc[10] |
|