[] ← これは範囲指定の時に使うぞ! ←別にそんなことはないぞ!
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!
上手く表示されましたね!