ある日偉い人に検索元のキーワードを変更しないかつ大小関係なくキーワードをマークアップして見せてご覧なさいとお願いされて完成したのが以下です。ご査収ください。
目的
dataに検索元の文章が入っているとします。それに対してkeywordで検索したときに大小関係なくマークアップをしたように文字列を返却するというのが今回の目的です。
結果
-
(?i)の前にあるkeywordを大小関係なく判定(iはinsentiveの略) - その
keywordを()で囲み一つのグループとする - 変更する部分+
$1をつける(ちなみにグループが2つあった場合は$1 $2)
↓↓コードで書くとこんな感じです↓↓
String keyword = "java";
String data = "Java java javaJava";
// (?i)で大文字小文字区別しない
// ヒットした文字を()でグループ化
data = data.replaceAll("((?i)" + Pattern.quote(keyword) + ")", "<mark>$1</mark>");
// <mark>Java</mark> <mark>java</mark> <mark>java</mark><mark>Java</mark>
System.out.println(data);
結果に至るまで
ゴリゴリとやってたらなんかダサいと言われた。。。笑(確かにwhileってなんかなぁとは思っていた)
良くない例
Pattern p = Pattern.compile(keyword, Pattern.CASE_INSENSITIVE).matcher(data);
while(p.find()) {
int start = p.start();
int end = p.end();
~発見した位置情報から計算してゴリゴリタグを埋めていく~
}
感想
結構綺麗に完結に実装できたのではないだろうかと思う。なんでも検索をしてその結果をマークアップして表示したい!なんて処理にはもってこいの書き方。あくまで例なので参考程度にどうぞ。
参考サイトとか