我想突出显示ArrayList的单个单词

时间:2019-06-07 10:30:17

标签: android regex kotlin spannablestring spannable

我想为从列表中收到的文本赋予背景色。目前,我可以突出显示所有单词,但是我想排除单词之间的空格

最初,我尝试使用模式匹配器正则表达式解决方案,以便排除双精度空格,我将其追加到列表中。然后我意识到这个解决方案不是最好的,因为我不能排除空格。因此,我决定使用SpannableStringBuilder并将项目附加在for循环内。但是不起作用,我只突出显示第一个单词,而不是所有单个单词(用空白(未着色)单词分隔

val spannable = SpannableStringBuilder()
            val span = BackgroundColorSpan(yellowColor))


            listOfUsers.forEach {
                val string = it.users

                spannable.append(string)
                spannable.setSpan(span, 0, string.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            }

            textValue.text = spannable

我希望不仅看到第一个单词,而且还会看到更新的单个单词。 请注意,我知道问题出在setSpan中,我将其设置为开始0,但我不知道如何使开始工作,因此要突出显示正确的初始字符串[I]字符

2 个答案:

答案 0 :(得分:0)

您可以创建返回Spannable的方法,如下所示:

public Spanned formatAutoSuggestText(final String autoSuggestText) {
        if (autoSuggestText == null) {
            return Html.fromHtml("");
        }

        try {
            String modifiedAutoSuggestText= "" ;
            final String searchText = "Text to highlight";
            final Pattern pattern = Pattern.compile(StringUtils.INSENSITIVE_CASE + searchText);
            final Matcher matcher = pattern.matcher(autoSuggestText);  
            int end = 0;
            while (matcher.find()) {
                final String subStringMatchFound = autoSuggestText.substring(end, matcher.end());
                final String stringToBeReplaced = autoSuggestText.substring(matcher.start(), matcher.end());
                final String stringToReplace = "<b><font color='" + mContext.getResources().getColor(R.color.search_autosuggest_highlighted_text) + "'>" +matcher.group()+ "</font></b>";
                modifiedAutoSuggestText += subStringMatchFound.replace(stringToBeReplaced,stringToReplace);
                end = matcher.end();
            }
            modifiedAutoSuggestText += autoSuggestText.substring(end);
            return Html.fromHtml(modifiedAutoSuggestText);
        }
        catch (final Exception e){
            return Html.fromHtml(autoSuggestText);
        }

    }

代码使用Java。您可以根据自己的需要进行更改。

答案 1 :(得分:0)

您可以像下面这样编写正则表达式以匹配多个空格。您也可以替换。

fun regexTest(){
    val words = listOf("Hello", "Hello World1", "Hello  World2",
        "Hello    World3", "Hello World4   ")

    val pattern = "\\s+".toRegex()


    words.forEach { word ->
        if (pattern.containsMatchIn(word)) {
            println("match ---> $word")
            var temWord = word.replace("\\s+"," ")

        }
    }

    var result:ArrayList<String> = ArrayList()
    for (s in words) {
        result.add(s.replace(pattern, " "))
    }

    for(wordToPrint in result){
        println("replaced ---> $wordToPrint")
    }

}

以下是上述程序的输出:

match ---> Hello World1
match ---> Hello  World2
match ---> Hello    World3
match ---> Hello World4   
replaced ---> Hello
replaced ---> Hello World1
replaced ---> Hello World2
replaced ---> Hello World3
replaced ---> Hello World4 

您可以根据需要修改正则表达式。