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
- 【参考】パターン内の括弧毎にマッチした部分文字列を取得