Java正規表現のmatches()とfind()の違いを徹底解説
はじめに
java.util.regex.Matcherクラスは、さまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使ってMatcherオブジェクトを取得します。
Matcherクラスには、入力文字列に対して正規表現とのマッチングを行うmatches()メソッドとfind()メソッドがあります。どちらのメソッドも、マッチが見つかればtrueを返し、見つからなければfalseを返すという点で共通しています。
しかし、両者には重要な違いがあります。最大の相違点は、matches()メソッドが入力領域(リージョン)全体との完全一致を試みるのに対し、find()メソッドはパターンに一致する部分文字列を順次検索するという点です。つまり、matches()は入力全体が正規表現に合致した場合のみtrueを返し、find()は領域内に少なくとも1つでもマッチが存在すればtrueを返します。
例1:matches()メソッドの場合
以下の例では、複数行のテキストの中に数字を含む行があるかどうかを、matches()メソッドで判定しています。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
String regex = "(.*)(\\d+)(.*)";
String input = "This is a sample Text, 1234, with numbers in between. "
+ "\n This is the second line in the text "
+ "\n This is third line in the text";
// Patternオブジェクトの生成
Pattern pattern = Pattern.compile(regex);
// Matcherオブジェクトの生成
Matcher matcher = pattern.matcher(input);
if(matcher.matches()) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
}
}実行結果
Match not found
この例では、入力文字列の一部の行に数字が含まれていないため、リージョン全体としては正規表現と一致せず、「Match not found」が出力されます。matches()メソッドは入力全体がパターンに合致しなければtrueを返さないためです。
例2:find()メソッドの場合
同じ入力文字列に対して、今度はfind()メソッドを使用してみます。find()は、パターンに一致する次の部分文字列を探します。領域内に1つでもマッチが見つかればtrueを返します。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
String regex = "(.*)(\\d+)(.*)";
String input = "This is a sample Text, 1234, with numbers in between. "
+ "\n This is the second line in the text "
+ "\n This is third line in the text";
// Patternオブジェクトの生成
Pattern pattern = Pattern.compile(regex);
// Matcherオブジェクトの生成
Matcher matcher = pattern.matcher(input);
if(matcher.find()) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
}
}実行結果
Match found
この例では、最初の行に「1234」という数字が含まれているため、find()メソッドはその部分文字列とのマッチを検出し、「Match found」が出力されます。
まとめ:matches()とfind()の使い分け
- matches():入力文字列(リージョン)全体が正規表現と完全に一致するかどうかを判定したい場合に使用します。バリデーション処理などに適しています。
- find():入力文字列の中からパターンに一致する部分文字列を検索したい場合に使用します。テキスト中からの特定パターンの抽出や検出に適しており、繰り返し呼び出すことで次々とマッチ箇所を見つけることができます。
用途に応じてこれら2つのメソッドを適切に使い分けることで、Javaでの正規表現処理をより効果的に行うことができます。
-
JREとJDKの違いは何?Java開発初心者向けにわかりやすく解説
Javaを学び始めると、必ず耳にするのが「JDK」と「JRE」という2つの用語です。名前が似ているため混同されやすいのですが、それぞれ役割や含まれる機能が異なります。この記事では、両者の違いを初心者にもわかりやすく解説します。 JDK(Java Development Kit)とは JDKは「Java Development Kit」の略で、Javaアプリケーションの開発と実行に必要なすべてのツールおよびライブラリをまとめたソフトウェアパッケージです。 JDKには以下のようなものが含まれています。 コンパイラ(javac):ソースコード(.javaファイル)をバイトコード(.classファイ
-
JavaとJavaScriptの違いとは?歴史・技術・使い分けを徹底解説
ウェブ開発者のジェレミー・キースは2009年、「JavaとJavaScriptの関係は、ハムとハムスターの関係のようなものだ」と語りました。この比喩がどれほど正確かは議論の余地がありますが、その本質は的確です。共通する言語的ルーツを持つにもかかわらず、JavaとJavaScriptはまったく異なる2つのプログラミング言語なのです。年月とともに両者の重なりも多少増えましたが、今なおJavaScriptはウェブサイトにインタラクティブ性をもたらすフロントエンド言語の主流であり続け、Javaはサーバーサイドやアプリケーション開発で人気を保っています。開発者を採用したい方、プログラミングを学びたい方