0
0

More than 1 year has passed since last update.

Java 正規表現メモ

Last updated at Posted at 2023-08-17

[] ← これは範囲指定の時に使うぞ! ←別にそんなことはないぞ!

Pattern pattern = Pattern.compile("^Hello, ([.]+)$");
String in = "Hello, Qiita!";
Matcher matcher = pattern.matcher(in);
if (!matcher.matches()) return;
System.out.println(matcher.group(1));

Hello, の後はアルファベットだけにしたいから [\\w]+ で......
やっぱり数字も含めたいから [\\w\\d]+ で.....
あー、でも記号とかも入れられるようにしたいなぁ...
それなら . を代わりに使えば!
[\\w\\d\\-\\+_\\./\\^\\$]+ -> [.]+

これで Qiita! が表示され......ません!
不正な正規表現パターンだよ!的なことを言われます。
なぜでしょうか。

理由は簡単で、 [] が複数の条件を持つパターンでのみ使用可能であるからです。
. は任意の一文字を表し、A から Z または 0 から 9 のように複数の条件を持ちません。


[修正 @2023年8月17日]
@PECMM さんよりご指摘をいただきました。ありがとうございます。

パターン内の [.] は『ドットの1文字にマッチする文字クラス』にならないでしょうか?

なんかおかしいなあと思ってはいたのですが、角括弧を外してしまえばとりあえず動くものにはなるしな......と、原因の追究を後回しにし、誤った解説をしてしまいました。

調べてみると

[...] は ... のいずれかの文字にマッチします。[...] の中では ^ $ . + * / [ { } ( ) の文字は意味を失います。

とほほの正規表現入門

というような解説が見つかりました。

上記の事柄を踏まえたうえで ([.]+) というパターンについて再度解説をすると、角括弧の中において . は「任意の一文字」ではなく .そのもの」 として扱われるので、 ([.]+). そのものを1回以上繰り返す文字列」 にマッチする正規表現パターンであることが分かります。

(Regular Expression Test Drive にて行ったテストの結果)
スクリーンショット 2023-08-17 232531.png


そのことを踏まえて上のコードを修正すると

Pattern pattern = Pattern.compile("^Hello, (.+)$");

となります。

System.out.println(matcher.group(1));
// Qiita!

上手く表示されましたね!

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0