给定字符串中的混合重音和普通字符在搜索时无法在java中工作

Sta*_*tar 9 java regex android matcher pattern-matching

String text = "Cámélan discovered ônte red ale?t \n Como se extingue la deuda";
Run Code Online (Sandbox Code Playgroud)

如果我给出输入Ca,它应该从给定的字符串Cá突出显示,但它不突出显示.

以下是我的尝试.

 Pattern mPattern; 
  String filterTerm; //this is the input which I give from input filter. Say for eg: Ca
   String regex = createFilterRegex(filterTerm);
        mPattern = Pattern.compile(regex);

 private String createFilterRegex(String filterTerm) {
        filterTerm = Normalizer.normalize(filterTerm, Normalizer.Form.NFD);
       filterTerm = filterTerm.replaceAll("[\\p{InCombiningDiacriticalMarks}]", "");
        return filterTerm;
    }

public Pattern getPattern() {
        return mPattern;
    }
Run Code Online (Sandbox Code Playgroud)

在另一堂课上,

private SpannableStringBuilder createHighlightedString(String nodeText, int highlightColor) { //nodeText is the entire list displaying. 
        SpannableStringBuilder returnValue = new SpannableStringBuilder(nodeText);
        String lowercaseNodeText = nodeText;
        Matcher matcher = mFilter.getPattern().matcher((createFilterRegex(lowercaseNodeText)));
        while (matcher.find()) {
            returnValue.setSpan(new ForegroundColorSpan(highlightColor), matcher.start(0),
                    matcher.end(0), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
        }

        return returnValue;
    }
Run Code Online (Sandbox Code Playgroud)

viewHolder.mTextView.setText(createHighlightedString((node.getText()),mHighlightColor));

但是我得到的输出是,

如果我单独输入单个字母o,它会突出显示,但如果我传递两个以上的字母表,例如:Ca,它不会突出显示.我无法弄清楚我在做什么错.

但如果你看看WhatsApp.它已经实现了.

我键入了Co,它识别并突出显示句子中的重音字符.

在此输入图像描述

Joo*_*gen 1

你已经得到了:

\n\n
private String convertToBasicLatin(String text) {\n    return Normalizer.normalize(text, Normalizer.Form.NFD)\n        .replaceAll("\\\\p{M}", "").replaceAll("\\\\R", "\\n");\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

为了使一个不带重音的基本拉丁字符与带重音的字母的一个Unicode 代码点相匹配,\none 不应将 标准化为组成的形式:

\n\n
private String convertToComposedCodePoints(String text) {\n    return Normalizer.normalize(text, Normalizer.Form.NFC).replaceAll("\\\\R", "\\n");\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

一般来说,人们可能会假设 Unicode 代码点也是 1 个字符长。

\n\n
    \n
  • 搜索键使用convertToBasicLatin(sought)
  • \n
  • 文本视图的内容使用convertToCompositedCodePoints(content)
  • \n
  • 匹配的文本内容使用convertToBasicLatin(content)
  • \n
\n\n

start现在,和的匹配器索引位置end是正确的。\n我将显式行结尾(正则表达式\\R)规范化为单个或。\n无法规范化为小写/大写,因为字符数可能会有所不同:\n德语小写对应于大写\\r\\n\\u0085\\n\xc3\x9fSS

\n\n
String sought = ...;\nString content = ...;\n\nsought = convertToBasicLatin(sought);\nString latinContent = convertToBasicLatin(content);\nString composedContent = convertToComposedUnicode(content);\n\nMatcher m = Pattern.compile(sought, Pattern.CASE_INSENSITIVE\n        | Pattern.UNICODE_CASE | Pattern.UNICODE_CHARACTER_CLASS\n        | Pattern.UNIX_LINES)\n    .matcher(latinContent);\nwhile (m.find()) {\n    ... // One can apply `m.start()` and `m.end()` to composedContent of the view too.\n}\n
Run Code Online (Sandbox Code Playgroud)\n