質問: p.matcher(str); if (m.find()){ System.out.println("マッチしました"); } ```
回答: ご質問分に貼り付けられた`¥¥`は、また円記号になっていますので、実際に試される場合には`\\`の方を使ってください。(コピペすると文字化けしてしまったように見えることがありますが、慌てずに正しいほうを選んでください。) さて、その前提で`String regex = "\\d.+?yen"`を見ると、Javaの文字列としてのエスケープを取り除くと、`\` `d` `.` `+` `?` `y` `e` `n`の8文字をJavaの正規表現エンジンに渡したことになります。 順番に見ていくと * `\` `d`: 正規表現でdigit、10進数の数字1文字にマッチします。 * `.`: 正規表現で一番よく使うメタ文字ですが、改行以外(*)の任意の1文字にマッチします。 * `+` `?`: 量指定のメタ文字で「最短一致で1回以上」前の要素が繰り返されることを表します。 * `y` `e` `n`: それぞれその文字そのものにマッチすることを表します。 あなたの提示された`str`にあてはめると、最初の`find()`の後は以下のようになります。 - `\` `d`: `1` - `.` `+` `?`: `0` `0` - `y` `e` `n`: `y` `e` `n` よって、マッチした部分全体を表示するコードを追加すれば、`100yen`がマッチしたことがわかるはずです。 ちなみにパターン内の`+`の後の`?`を削除してしまうと最長一致になるので、最初の1回の`find()`で、`100yen, Lemon is 80yen`がマッチします。 ざっくり言うと、元の正規表現パターンは「数字で始まって直近の`yen`まで」を探し出すパターンと言うことになります。 (*) `.`を改行にもマッチするように指示できるオプションもあります。