29056


Javaの正規表現についてサイトを通して勉強中です。  
下記のソースを実行しましたが結果は  
「マッチしません」と表示されてサイトでは「マッチする」という結果になります。なぜでしょうか。  
■ソース

[code]

        String str1 = "stat[01]end";
        String str2 = "array[int]";
    
        String regex = "¥¥[.*¥¥]";
        Pattern p = Pattern.compile(regex);
    
        check(p, str1);
        check(p, str2);
      }
    
      private static void check(Pattern p, String target){
        Matcher m = p.matcher(target);
    
        if (m.find()){
          System.out.println("マッチします");
          System.out.println("マッチした部分は " + m.group() + " です");
        }else{
          System.out.println("マッチしません");
        }
      }
    }
    
[/code]


CC BY-SA 3.0
2016-09-22T10:54:32.247
29055
2016-09-22T18:25:31.090
2016-09-22T18:25:31.090
5519
17348
question
java 正規表現
正規表現のエスケープが期待通りに動作しない


おそらく`¥`記号のせいでしょう。あなたがコードに貼り付けた`¥`はユニコードのU+00A5, 本来の円記号であり、これはエスケープ記号としては働きません。

あなたがアクセスされる環境で読めるように再現するのは難しいのですが、最近ではWindowsマシンでもフォントを選べば表示できたかと思いますので、ちょっとフォントの設定を変更してU+00A5の円記号`¥`とU+005Cのバックスラッシュ(Unicode用語だとREVERSE
SOLIDUS)`\`が異なる表示になるようにしてみてください。(U+005Cは歴史的な経緯で日本語のインストールされたマシンでは円記号のように表示されることが多いですが、Unicode的にはバックスラッシュでないといけません。)

Javaの文字列のエスケープ記号(Java内の正規表現のエスケープ記号も)はU+005Cの`\`の方ですので、あなたがご質問に書かれた文字では正常に動作しません。フォントの設定がうまくいかない場合には、以下の1行をコピペで貼り付けて`regex`の行と置き換えてみてください。

[code]

    String regex = "\\[.*\\]";
    
[/code]


CC BY-SA 3.0
2016-09-22T11:10:49.113
29056
2016-09-22T11:10:49.113
13972
29055
answer