[] ← これは範囲指定の時に使うぞ! ←別にそんなことはないぞ!
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 にて行ったテストの結果)
そのことを踏まえて上のコードを修正すると
Pattern pattern = Pattern.compile("^Hello, (.+)$");
となります。
System.out.println(matcher.group(1));
// Qiita!
上手く表示されましたね!