こんにちは! ログログです。
34歳で開発未経験から開発エンジニアになり、今ではフリーランスエンジニアとして働いています!
Stringのmatches、containsメソッドなどを使った完全一致、部分一致を解説します!
完全一致
matches
完全一致は文字列が同じであることを判定するだけですので、matchesを使うなら正規表現は使わずに判定します。
正直、完全一致であればequalsでよい気はしますが。
1 2 3 4 5 6 7 8 |
// 完全一致 String str1 = "1234567890"; // True System.out.println(str1.matches("1234567890")); // 文字列が完全に一致する // False System.out.println(str1.matches("123456789")); // 文字列が完全に一致しない |
部分一致(前方一致)
matches
前方一致には、「^(ハットマーク)」を使います。
※帽子のような形をしているため、ハット(hat)と呼んでいます。
「^」は文字列の最初であることを示す記号です。
「^123.*」のように、最初がどんな文字列と一致しているべきかを指定します。
前方一致部分が固定値の場合、startWithメソッドを使用することができます。
その場合、正規表現での一致判定はできないのでご注意ください。
1 2 3 4 5 6 7 8 9 10 11 |
// 部分一致(前方一致) String str2 = "1234567890"; // True System.out.println(str2.matches("^123.*")); // 3文字の前方一致 System.out.println(str2.matches("^1234567890.*")); // 10文字 + 任意の0文字以上の前方一致 System.out.println(str2.matches("^123456789.")); // 9文字 + 任意の1文字の前方一致 // False System.out.println(str2.matches("^124.*")); // 3文字の前方不一致 System.out.println(str2.matches("^1234567890.")); // 10文字 + 任意の1文字の前方不一致 |
<補足>
「.(ドット)」
何らかの1文字です。
どんな文字でもかまいませんが、1文字が必ずあることを示します。
「*(アスタリスク)」
直前の文字の0回以上の繰り返しです。
つまり、「.*」は「.」が0回以上繰り返されるということです。
0回もあり得るため、繰り返さないパターンも含みます。
(例)
正規表現:^123.*
Trueになるパターン:123、1234、123AAAA
startsWith
前方一致にはstatsWithメソッドも使えます。
前方一致してほしい文字列を指定すればよいだけですが、正規表現は使えないのでその場合はmatchesを検討して下さい。
1 2 3 4 5 6 7 8 9 |
// 部分一致(前方一致) String str2 = "1234567890"; // True System.out.println(str2.startsWith("123")); // startWithメソッドによる前方一致 // False System.out.println(str2.startsWith("234")); // startWithメソッドによる前方不一致 System.out.println(str2.startsWith("123.*")); // startWithメソッドで正規表現は使用不可 |
部分一致(後方一致)
matches
後方一致には、「$(ドル)」を使います。
「$」は文字列の最後であることを示す記号です。
「.*890$」のように、最後がどんな文字列と一致しているべきかを指定します。
後方一致部分が固定値の場合、endWithメソッドを使用することができます。
その場合、正規表現での一致判定はできないのでご注意ください。
1 2 3 4 5 6 7 8 9 10 11 |
// 部分一致(後方一致) String str3 = "1234567890"; // True System.out.println(str3.matches(".*890$")); // 任意の0文字以上 + 3文字の後方一致 System.out.println(str3.matches(".*1234567890$")); // 任意の0文字以上 + 10文字の後方一致 System.out.println(str3.matches(".234567890$")); // 任意の1文字 + 9文字の後方一致 // False System.out.println(str3.matches(".*190$")); // 任意の0文字以上 + 3文字の後方不一致 System.out.println(str3.matches(".1234567890$")); // 任意の1文字 + 10文字の後方不一致 |
endsWith
後方一致にはendsWithメソッドが使えます。
startsWith同様に正規表現は使えないのでmatchesを検討して下さい。
1 2 3 4 5 6 7 8 9 |
// 部分一致(後方一致) String str3 = "1234567890"; // True System.out.println(str3.endsWith("890")); // endsWithメソッドによる後方一致 // False System.out.println(str3.endsWith("789")); // endsWithメソッドによる後方不一致 System.out.println(str3.endsWith(".*890")); // endsWithメソッドで正規表現は使用不可 |
部分一致(部分一致)
matches
部分一致には、「^」と「$」を使います。
「.*456.*$」のように、最初から最後までの間に指定した文字列が含まれるように指定します。
1 2 3 4 5 6 7 8 9 10 11 |
// 部分一致(部分一致) String str4 = "1234567890"; // True System.out.println(str4.matches(".*456.*$")); // 3文字の部分一致 System.out.println(str4.matches("^.*1234567890.*$")); // 任意の0文字以上 + 10文字 + 任意の0文字以上の部分一致 System.out.println(str4.matches("^.23456789.$")); // 任意の1文字 + 8文字 + 任意の1文字の部分一致 // False System.out.println(str4.matches(".*444.*$")); // 3文字の部分一致 System.out.println(str4.matches("^.1234567890.$")); // 任意の1文字 + 10文字 + 任意の1文字の部分一致 |
contains
containsメソッドを使う場合、指定した文字列が含まれていればTrueを返します。
1 2 3 4 5 6 7 8 |
// 部分一致(部分一致) String str4 = "1234567890"; // True System.out.println(str4.contains("456")); // 任意の3文字 // False System.out.println(str4.contains("444")); // 任意の3文字 |
まとめ
・完全一致は、文字列が全く同じであること。(matchesとequalsが使える)
・部分一致には、前方/後方/部分一致がある。
・前方一致には、matchesメソッドで^を使うかstartsWithを使う。
・後方一致には、matachesメソッドで$を使うかendsWithを使う。
・部分一致には、matachesメソッドで^と$を使った正規表現か、containsメソッドで判定できる。
・matachesメソッドでは .と*で、任意の文字を指定して、柔軟な判定ができる。
参考(Java Docs)
[Java Docs] String matches(String regex)
コメント