2010年9月1日水曜日

正規表現の前方/後方一致

正規表現の前方/後方一致の書き方をすぐに忘れてしまうのでメモ。

@Test
public void 後方一致() throws Exception {
String value = "ogawa ogawaです。";
String replace = value.replaceAll("ogawa(?=です)", "おがわ");
assertEquals("ogawa おがわです。", replace);
}

@Test
public void 後方不一致() throws Exception {
String value = "ogawa ogawaです。";
String replace = value.replaceAll("ogawa(?!です)", "おがわ");
assertEquals("おがわ ogawaです。", replace);
}

@Test
public void 前方一致() throws Exception {
String value = "生クリーム大好き。メロン大好き。";
String replace = value.replaceAll("(?<=メロン)大好き", "大嫌い");
assertEquals("生クリーム大好き。メロン大嫌い。", replace);
}

@Test
public void 前方不一致() throws Exception {
String value = "生クリーム大好き。メロン大好き。";
String replace = value.replaceAll("(?<!生クリーム)大好き", "大嫌い");
assertEquals("生クリーム大好き。メロン大嫌い。", replace);
}


TwitterのアカウントをURLに変換する時はこんな感じ。

@Test
public void twitterアカウント() throws Exception {
String value = "@aqubi リンクを@つくってね@ @sora_usagi こっちも。";
String replace = value.replaceAll("(?<!\\w)@(\\w+)", "<a href=\"http://www.twitter.com/$1\">l@$1</a>");
assertEquals("<a href=\"http://www.twitter.com/aqubi\">@aqubi</a> リンクを@つくってね@ <a href=\"http://www.twitter.com/sora_usagi\">@sora_usagi</a> こっちも。", replace);
}


(?<!\\w)の部分は後方一致でGroupではないので、(\\w+)の部分の値は$1になっています。
• • •