正则表达式:在任何情况下突出显示 TextView 中的输入

Regex: Highlight an input in any case in TextView

我正在应用程序上实现搜索功能,搜索结果中突出显示了搜索关键字。

到目前为止我已经实施了这个并且部分有效:

public static String searchHighlightedKeyword(String keyword, String whole) {
    String highlighted = "<font color='#1e499f'><b>" + keyword +"</b></font>";
    return whole.replaceAll(keyword, highlighted);
}

但是,当大小写不匹配时它不起作用:

我认为我必须实施某种 RegEx 才能实现此目的,但我不知道如何实现。

使用不区分大小写的修饰符来匹配关键字(您也可以 Pattern.quote 使匹配更安全,因为它转义了特殊的正则表达式元字符)和对整个匹配的 [=12=] 反向引用:

public static String searchHighlightedKeyword(String keyword, String whole) {
    String highlighted = "<font color='#1e499f'><b>[=10=]</b></font>";
    return whole.replaceAll("(?i)" + Pattern.quote(keyword), highlighted);
}

这里,

  • "(?i)" - 一个不区分大小写的内联修饰符
  • Pattern.quote(keyword) - keyword 所有特殊的正则表达式元字符都转义了(因此 () 不会抛出异常)
  • [=12=] - 在替换字符串中,引用整个匹配值。

试试这个

  public void searchHighlightedKeyword(TextView textView, String keyword, String whole) {
        int startPos = whole.toLowerCase().indexOf(keyword.toLowerCase());
        if (startPos < 0) {
            textView.setText(whole);
            return;
        }
        int endPos = startPos + keyword.length();
        SpannableString spannable2 = new SpannableString(whole);
        spannable2.setSpan(new ForegroundColorSpan(Color.RED), startPos, endPos,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        textView.setText(spannable2);
    }