LoginSignup
3
3

More than 5 years have passed since last update.

検索のキーワードを大小文字関係なくかつ検索元のワードを変更せずにマークアップする方法

Last updated at Posted at 2018-07-02

ある日偉い人に検索元のキーワードを変更しないかつ大小関係なくキーワードをマークアップして見せてご覧なさいとお願いされて完成したのが以下です。ご査収ください。

目的

dataに検索元の文章が入っているとします。それに対してkeywordで検索したときに大小関係なくマークアップをしたように文字列を返却するというのが今回の目的です。

結果

  1. (?i)の前にあるkeywordを大小関係なく判定(iはinsentiveの略)
  2. そのkeyword()で囲み一つのグループとする
  3. 変更する部分+$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);

Gist

結果に至るまで

ゴリゴリとやってたらなんかダサいと言われた。。。笑(確かにwhileってなんかなぁとは思っていた)

良くない例
Pattern p = Pattern.compile(keyword, Pattern.CASE_INSENSITIVE).matcher(data);
while(p.find()) {
  int start = p.start();
  int end   = p.end();
  ~発見した位置情報から計算してゴリゴリタグを埋めていく~
}

感想

結構綺麗に完結に実装できたのではないだろうかと思う。なんでも検索をしてその結果をマークアップして表示したい!なんて処理にはもってこいの書き方。あくまで例なので参考程度にどうぞ。

参考サイトとか

3
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3