카테고리 없음

문자열속 키워드 찾아서 하이라이팅

그란. 2021. 8. 19. 09:31

 

고려해야할점 

1. 검색어는 여러개 있을 수 있다.

2. Spannable 처리 

 

        val (keyword, posts) = from
        val pattern = Pattern.compile("($keyword)")

        return posts.map { post ->
            val result = pattern.matcher(post.description)
            val content = SpannableStringBuilder()

            var start = 0

            while (result.find()) {
                content.color(resourceProvider.getColor(R.color.black_4)) {
                    append(post.description, start, result.start())
                }
                content.color(resourceProvider.getColor(R.color.dusty_orange)) {
                    append(post.description, result.start(), result.end())
                }
                start = result.end()
            }
            content.append(post.description, start, post.description.length)
        }

 


삽질 기록 

 

if (result.find()) {
    for (i in 0 until result.groupCount()) {
        content.color(resourceProvider.getColor(R.color.black_4)) {
            append(post.description, start, result.start(i))
        }
        end = result.end(i)
        content.color(resourceProvider.getColor(R.color.dusty_orange)) {
            append(post.description, result.start(i), end)
        }
        start = end
    }
}

 -> for문으로 접근해서 인덱스로써 접근 불가능.
start(0), start(1) 이렇게 해도 같은 결과값 나옴.
Matcher의 find() 가 이렇게 구현 되어있음.

 

public boolean find() {
    int nextSearchIndex = this.last;
    if (nextSearchIndex == this.first) {
        ++nextSearchIndex;
    }

    if (nextSearchIndex < this.from) {
        nextSearchIndex = this.from;
    }

    if (nextSearchIndex <= this.to) {
        return this.search(nextSearchIndex);
    } else {
        for(int i = 0; i < this.groups.length; ++i) {
            this.groups[i] = -1;
        }

        return false;
    }
}

 last 라는 Matcher 클래스의 전역변수를 내부적으로 이용함 ( 포인터 )
-> find() 를 호출해야 다음 항목으로 접근가능