正则表达式:在任何情况下突出显示 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);
}
我正在应用程序上实现搜索功能,搜索结果中突出显示了搜索关键字。
到目前为止我已经实施了这个并且部分有效:
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);
}