読者です 読者をやめる 読者になる 読者になる

Javaプログラマーの技術メモ

勉強したことのメモ帳

Javaの正規表現

正規表現の復習メモ

メタ文字「.」

なんでもよい1文字を表す。通常は、改行を含めることができない。

改行を含めるには、Pattern.DOTALL オプションを利用する。 https://docs.oracle.com/javase/jp/7/api/java/util/regex/Pattern.html#DOTALL

(例)コード

String str = "before";
str += System.lineSeparator();
str += "after";
String regex = "(before).*(after)";

Pattern p=Pattern.compile(regex,Pattern.DOTALL);
Matcher m = p.matcher(str);

if(m.find()){
    System.out.println(m.group());
}

(例)出力結果

before
after

メタ文字「*」「+」「?」

直前の繰り返しを表す文字。 「*」は、直前の文字が1個もないか、1個以上連続することを示す。 「+」は、直前の文字が1個以上連続することを示す。 「?」は、直前の文字が1個だけあることを示す。

(例)コード

String str = "abbbb";
String regex = "ab+";

Pattern p=Pattern.compile(regex);
Matcher m = p.matcher(str);

if(m.find()){
    System.out.println(m.group());
}

(例)出力結果

abbbb

メタ文字「^」

行の先頭にある文字列の検索に利用する。

  • 単一行

(例)コード

String str = "first_line_second";
String regex = "^(first).+";

Pattern p=Pattern.compile(regex);
Matcher m = p.matcher(str);

if(m.find()){
    System.out.println(m.group());
}

(例)出力結果

first_line_second

(例)コード

String str = "first_line";
str += System.lineSeparator();
str += "second_line";
String regex = "^(first).+";

Pattern p=Pattern.compile(regex, Pattern.MULTILINE);
Matcher m = p.matcher(str);

if(m.find()){
    System.out.println(m.group());
}

(例)出力結果

first_line

メタ文字「$」

行の最後にある文字列の検索を利用する。

  • 単一行

(例)コード

String str = "first_line_second";
String regex = ".+(second)$";

Pattern p=Pattern.compile(regex);
Matcher m = p.matcher(str);

if(m.find()){
    System.out.println(m.group());
}

(例)出力結果

first_line_second

(例)コード

String str = "line_first";
str += System.lineSeparator();
str += "line_second";
String regex = ".+(first)$";

Pattern p=Pattern.compile(regex, Pattern.MULTILINE);
Matcher m = p.matcher(str);

if(m.find()){
    System.out.println(m.group());
}

(例)出力結果

line_first

メタ文字「()」

グループ化の機能。()で囲んだ文字列をグループ化して扱うことができる。

String str = "before_content_after";
String regex = ".(content).";

Pattern p=Pattern.compile(regex);
Matcher m = p.matcher(str);

if(m.find()){
    System.out.println(m.group());
}

(例)出力結果

_content_

メタ文字「[]」

指定された文字のどれらかを表す機能。

エスケープ

\を前につける。「^」

ただし、Javaのコードとして記述する際には、「\」自体をエスケープする必要があり、以下のようになる。

(例)コード

String regex = "\\^";

http://www.mnet.ne.jp/~nakama/

文字列の取得

  • メタ文字「()」のグループに合致する範囲をMatcher.group()にて取得することができる。
  • グループが複数存在する場合は、Matcher.group(int)にて取得することができる。
  • 引数のインデックスは、1から始まる。インデックスは、「()」の出現順に振られる。

https://docs.oracle.com/javase/jp/7/api/java/util/regex/Matcher.html#group(int)

(例)コード

String str = "before_test1_content_test2_after";
String regex = "((before).+(content).+(after))";

Pattern p=Pattern.compile(regex);
Matcher m = p.matcher(str);

if(m.find()){
    for(int i=1; i<=m.groupCount(); i++){
        System.out.println(m.group(i));
    }
}

(例)出力結果

before_test1_content_test2_after
before
content
after
  • 【参考】パターン内の括弧毎にマッチした部分文字列を取得

http://www.javadrive.jp/regex/ref/index2.html