Edited at

【Java】Matcherと正規表現で文字列中の一部を切り出す


やること

はてなブログのURL文字列は「entry/年/月/日/時間」というような形式になっています(例のURLは無効な内容です)。

https://hogefugapiyo.hatenablog.com/entry/2019/09/02/000000

今回は例として、このURLから年・月・日を切り出します。


やり方

java.util.regex.Matcherを使います。

Matcher matcher = Pattern

.compile(".+/entry/(\\d+)/(\\d+)/(\\d+)/.+")
.matcher(/* 比較対象URL文字列 */);

int year = Integer.parseInt(matcher.replaceFirst("$1"));
int month = Integer.parseInt(matcher.replaceFirst("$2"));
int day = Integer.parseInt(matcher.replaceFirst("$3"));


解説

タイトルでは切り出しと表現しましたが、この処理は本来「入力が正規表現と一致する場合、一致した部分を指定した正規表現で置換する」という内容です。

今回の場合は比較対象URL文字列全体が正規表現とマッチするため、文字列全体が指定した内容で置き換えられ、結果として切り出したように見えると言う感じです。

$1が何かと言うと、これは正規表現中で()で囲んだ内容です。

正規表現内でこれは変数のように扱えます。

本質を無視するなら.+/entry/(\\d+)/(\\d+)/(\\d+)/.+.+/entry/$1/$2/$3/.+と読み替えると分かりやすいと思います。

文字列に対する処理なので、切り出した結果は当然文字列で帰ってきます。


別解

以下のように書いても同等の処理ができますが、何度もやるのであれば先にPatterncompileしておいた方が処理効率が高いです。

String year = /* 比較対象URL文字列 */.replaceFirst(".+/entry/(\\d+)/(\\d+)/(\\d+)/.+", "$1");


おまけ

正規表現は以下のようなサイトでデバッグしておくと捗ります(ただし言語間の差異などあるので単体テストもやった方がいいと思います)。