

Javaの正規表現についてサイトを通して勉強中です。  
下記の「
"¥¥d.+?yen";」と書かれている部分の意味が分かりません。ターゲットの文字列に対してどういうパターンにならマッチすることを意味しているのか教えていただけませんか。  
■ソース

[code]

    String str = "Tomato is 100yen, Lemon is 80yen.";
    String regex = "¥¥d.+?yen";
    Pattern p = Pattern.compile(regex);
    
    Matcher m = p.matcher(str);
    if (m.find()){
      System.out.println("マッチしました");
    }
    
[/code]


CC BY-SA 3.0
2016-09-22T11:36:09.587
29057
2016-09-22T18:26:07.480
2016-09-22T18:26:07.480
5519
17348
question
java 正規表現
¥¥d.+?yenという正規表現の意味


ご質問分に貼り付けられた`¥¥`は、また円記号になっていますので、実際に試される場合には`\\`の方を使ってください。(コピペすると文字化けしてしまったように見えることがありますが、慌てずに正しいほうを選んでください。)

さて、その前提で`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`まで」を探し出すパターンと言うことになります。

(*) `.`を改行にもマッチするように指示できるオプションもあります。


CC BY-SA 3.0
2016-09-22T12:03:20.097
29058
2016-09-22T12:03:20.097
13972
29057
answer


正規表現についてはjava.util.regex.PatternのAPIリファレンスの中に説明があります。`\\d`は数字([0-9]と同じ)、`.`は任意の1文字、`+?`は１回以上の繰り返し（最短一致数量子）といったことが網羅的に記載されてますのでまずはここをご覧ください。

ただし最長一致数量子/最短一致数量子/強欲な数量子は常識でしょうとでもいいたいかのようにリファレンスに詳しい説明はありません><

これらの違いについては例えば次のページのように検索すれば詳しく説明しているページが見つかると思います。  
[最長一致数量子/最短一致数量子/強欲な数量子](http://www.javadrive.jp/regex/repeat/index2.html)


CC BY-SA 3.0
2016-09-22T12:16:53.263
29059
2016-09-22T12:16:53.263
4417
29057
answer