Java - String.matches()で文字列パターンを確認し、様々な例の紹介

String.matches()で特定のパターンの文字列が含まれているかどうかを確認することができます。特定のパターンと正規表現(Regex)を意味します。 文字列に正規表現が一致するかどうかbooleanに戻します。これにより、文字列が私が探してパターンで構成されているかどうかがわかります。

複数のパターンを例に紹介しながら matches()を適用する方法を説明します。

正規表現について詳しく知りたい方は正規表現(regex)、様々な例として簡単に理解するを参照してくださいお勧めします。

matches()基本的な例

matches()は引数として正規表現を受け取ります。そして、文字列とパターンが一致するかどうか返します。

String.contains()と大きな差がないように見え、次の例を見れば、違いがあります。

String str = "Welcome to codechacha";

System.out.print("Does String contains regex (.*)code(.*) ? : ");
System.out.println(str.matches("(.*)code(.*)"));

System.out.print("Does String contains regex code ? : ");
System.out.println(str.matches("code"));

System.out.print("Does String contains regex Welcome(.*) ? : " );
System.out.println(str.matches("Welcome(.*)"));

上記の例では、 (.*)は0個以上のからなる任意の文字列を意味します。 そのため、正規表現 (.*)code(.*)はcode両側に任意の文字列が来ても関係なく、codeが存在するかだけを確認します。 この正規表現は contains("code")とほぼ同じであると考えてください。

一方、正規表現 codeは両側にいくつかの文字が来れば一致していないと判断します。そのため、falseが返されます。

Welcome(.*)はWelcomeで開始し、その後ろに0個以上の文字が来るパターンがあるときにtrueを返します。

Output:

Does String contains regex (.*)code(.*) ? : true
Does String contains regex code ? : false
Does String contains regex Welcome(.*) ? : true

contains()とmatches()の違い

前述のように、 contains()は、単に引数として渡された文字列が存在するかどうかを返します。 一方、 matches()は正規表現を引数として受け取り、同じパターンの文字列であればtrueを返します。

正規表現は、探し文字の周りの文字も考慮するので、正規表現を詳しく知らなければ適用することは困難です。

System.out.print("Does String contains regex (.*)code(.*) ? : ");
System.out.println(str.matches("(.*)code(.*)"));

System.out.print("Does String contains regex code ? : ");
System.out.println(str.matches("code"));

True / trueの文字列パターンの検索

ユーザーからtrueという文字列を受け取ったときに、その文字列が実際にtrueかどうかを確認する必要があります。 もちろん、大文字と小文字を区別するためにif文を二度使用したり、containsを使用することができます。 しかし、この記事では、matchesに対して学ぶためmatchesを利用して実装してみました。

次のように matches()で実装しました。

String str = "True";
System.out.println("Is it true ? : " + str.matches("[Tt]rue"));

str = "true";
System.out.println("Is it true ? : " + str.matches("[Tt]rue"));

str = "yes";
System.out.println("Is it true ? : " + str.matches("[Tt]rue"));

Output:

Is it true ? : true
Is it true ? : true
Is it true ? : false

正規表現 [Tt]は、 "T"または "t"のどちらかの文字を意味します。

True、Yes、文字列パターンの検索

以下は、True / true、Yes / yes文字列を一緒に探し例です。

String str = "yes";
System.out.println("Is it true or yes ? : " + str.matches("[Tt]rue|[Yy]es"));

str = "true";
System.out.println("Is it true or yes ? : " + str.matches("[Tt]rue|[Yy]es"));

str = "no";
System.out.println("Is it true or yes ? : " + str.matches("[Tt]rue|[Yy]es"));

正規表現の |はorを意味します。

Output:

Is it true or yes ? : true
Is it true or yes ? : true
Is it true or yes ? : false

文字、数字パターンの検索

次の例では、aが0個以上、そして数が0個以上のパターンを検索します。

String str = "aaa123";
System.out.println(str.matches("a*[0-9]*"));

Output:

true

文字列パターンの検索

以下は、「H」で開始し、次のいくつかの文字が来て、最後に「llo」で終わってパターンを検索します。

System.out.println("Hello".matches("H.llo"));
System.out.println("Hallo".matches("H.llo"));
System.out.println("Hollo".matches("H.llo"));

Output:

true
true
true

正規表現の .はどの文字1つを意味します。したがってHの次にどのような文字1ついればされます。

EXで始まるパターンの検索

以下は、「EX_ "で始まり、その次のa〜gの文字がまたは1〜5の数字が来るパターンを検索します。

System.out.println("Ex_a".matches("Ex_[a-g1-5]"));
System.out.println("Ex_g".matches("Ex_[a-g1-5]"));
System.out.println("Ex_1".matches("Ex_[a-g1-5]"));
System.out.println("Ex_6".matches("Ex_[a-g1-5]"));

Output:

true
true
true
false

正規表現で a-gはaからgまでのアルファベット1つを意味します。 そして、 1-5は1から5までの数字1つを意味します。

Thisで開始し。で終わるパターン

次はThisで開始し、 "。"で終わるパターンを検索します。もし ""で終わらない場合はfalseを返します。

System.out.println("This is the right decision.".matches("This.*\\."));
System.out.println("This is me".matches("This.*\\."));
System.out.println("This is my mistake.".matches("This.*\\."));

Output:

true
false
true

正規表現 .ではなく、単に文字 .を表現したい場合は、 \\.に書いてなければなり。

It + a fewパターンの検索

Itで開始しa fewが中間に入っているパターンを探します。

System.out.println("It's been a few days".matches("It.+a few.*"));
System.out.println("It's been a few over a year".matches("It.+a few.*"));
System.out.println("It's been about a week".matches("It.+a few.*"));

Output:

true
true
false

正規表現で .+は文字1つ以上を意味します。

[A-1]パターンの検索

次は、 "[A-数字]"で始まるパターンを検索します。

System.out.println("[A-1] Jason".matches("\\[A\\-.+\\].*"));
System.out.println("[A-12] Todd".matches("\\[A\\-.+\\].*"));
System.out.println("[B-12] MJ".matches("\\[A\\-.+\\].*"));

Output:

true
true
false

正規表現で単純な文字の意味で [を使用するには、 \\[で入力する必要があります。 -の場合でも、 \\-で入力する必要があります。

Patternにmatchesを適用する方法

String.matches()ではなく、Patternクラスを使用して、matchesを適用することができます。

次のように Pattern.matches()のregexとstringを引数として渡すと、 String.matches()と同じ結果を返します。

String text = "The URL is: http://mydomain.com";
String regex = ".*http://.*";

boolean matches = Pattern.matches(regex, text);
System.out.println(matches);

参考

codechachaCopyright ©2019 codechacha