【Java】正規表現について

こんにちは。技術部のNです。 今回は、Javaの正規表現について書いていこうと思います。


Java 正規表現処理の基本

Javaで正規表現処理を行うには、PatternクラスとMatcherクラスをします。
Patternクラスは、正規表現パターンをコンパイルして、Matcherクラスに渡します。Matcherクラスは正規表現パターンに一致する文字列の位置や長さなどの情報を提供します。


正規表現パターン

メタ文字  意味
. 任意の文字 .* は、任意の文字が0文字以上繰り返されるパターンにマッチします。
[a-zA-Z] アルファベット [a-zA-Z]+ は、アルファベットが1文字以上繰り返されるパターンにマッチします。
[0-9] 数字 [0-9]+ は、数字が1文字以上繰り返されるパターンにマッチします。
\w 文字 アルファベット、数字、記号のいずれか
\s 空白 空白文字(スペース、タブ、改行など)
\d 数字
\D 数字以外
\w 文字
\W 文字以外
^ 文字列の先頭 ^ABC は、文字列の先頭が ABC であるパターンにマッチします。
\ \ 文字列の末尾 \ ABC は、文字列の末尾が ABC であるパターンにマッチします。
* 前方の文字を0回以上繰り返す a* は、a が0回以上繰り返されるパターンにマッチします。
+ 前方の文字を1回以上繰り返す a+ は、a が1回以上繰り返されるパターンにマッチします。
? 前方の文字を0回または1回繰り返す a? は、a が0回または1回繰り返されるパターンにマッチします。


応用的な正規表現パターン

メタ文字 意味
{n} 前方の文字をn回繰り返す a{3} は、a が3回繰り返されるパターンにマッチします。
{n,m} 前方の文字をn回以上m回以下繰り返す a{3,5} は、a が3回以上5回以下繰り返されるパターンにマッチします。
\b 単語の境界 \babc は、文字列の境界(単語の境界)で abc が現れるパターンにマッチします。
\B 単語の境界以外 \Babc は、文字列の境界以外で abc が現れるパターンにマッチします。
(?pattern) グループ化 グループ化されたパターンを、名前で参照することができます。
(?=pattern) 先行条件 パターンが先行する文字列にマッチします。
(?!pattern) 否定先行条件 パターンが先行しない文字列にマッチします。


Matcher クラスの基本的な使い方

Matcher クラスの基本的な使い方は、次のとおりです。

  • Pattern クラスで正規表現パターンをコンパイルする。
  • Matcher クラスの matcher メソッドで、コンパイルしたパターンと検索対象の文字列を渡す。
  • Matcher クラスの find メソッドで、マッチする文字列の位置を取得する。
  • Matcher クラスの group メソッドで、マッチした文字列を取得する。

以下は文字列に含まれる数値を検索する例です。

				
					java
String str = "私の名前は山田太郎です。郵便番号は123-4567です。";

				
			

この文字列から、名前と郵便番号を抽出したいとします。
その場合、以下のような正規表現パターンを使うことができます。

				
					java
//名前は任意の文字列
String namePattern = "名前は(.+?)です。";
//郵便番号は数字3桁-数字4桁
String zipPattern = "[0-9]{3}-[0-9]{4}";

				
			

次に、以下のようにPatternオブジェクトとMatcherオブジェクトを生成します。

				
					java
//名前のパターンをコンパイル
Pattern namePatternObj = Pattern.compile(namePattern);
//郵便番号のパターンをコンパイル
Pattern zipPatternObj = Pattern.compile(zipPattern);
//名前のパターンを文字列に適用
Matcher nameMatcher = namePatternObj.matcher(str);
//郵便番号のパターンを文字列に適用
Matcher zipMatcher = zipPatternObj.matcher(str);

				
			

最後に、以下のようにMatcherのメソッドを使って、名前と郵便番号を取得します。

				
					java
//名前が見つかったら
if (nameMatcher.find()) {
    //名前を取得
    String name = nameMatcher.group(1);
    //名前を出力
    System.out.println("名前: " + name);
}
//郵便番号が見つかったら
if (zipMatcher.find()) {
    //郵便番号を取得
    String zip = zipMatcher.group();
    //郵便番号を出力
    System.out.println("郵便番号: " + zip);

				
			

このコードを実行すると、以下のような結果が得られます。

				
					名前: 山田太郎
郵便番号: 123-4567
				
			

初歩的な内容ではありますが、正規表現の理解を深めるために、再認識も兼ねて書かせていただきました。
正規表現を学習して、テキスト処理やプログラミングを効率化しましょう!
最後までお読みいただきありがとうございました。

スーパーソフトウエアの採用情報

あなたが活躍できるフィールドと充実した育成環境があります

blank
blank