Regex: выделение ввода в любом случае в TextView - PullRequest
0 голосов
/ 02 мая 2018

Я реализую функцию поиска в приложении, в котором результаты поиска выделены ключевым словом.

enter image description here

Я реализовал это до сих пор, и это частично работает:

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

Однако, это не работает, когда случаи не совпадают: enter image description here

Я подумал, что мне нужно реализовать какой-то RegEx, чтобы достичь этого, но я понятия не имею, как.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Попробуйте это

  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);
    }
0 голосов
/ 02 мая 2018

Используйте модификатор без учета регистра, чтобы сопоставить ключевое слово (которое также можно Pattern.quote, чтобы сделать сопоставление более безопасным, поскольку оно избегает специальных метасимволов регулярных выражений) и обратную ссылку $0 на все совпадение:

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

Здесь

  • "(?i)" - модификатор, не чувствительный к регистру символов
  • Pattern.quote(keyword) - keyword со всеми специальными метасимволами регулярных выражений, сбежавшими (так как ( или ) не может вызвать исключение)
  • $0 - в строке замены ссылается на полное значение совпадения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...