基于正则表达式的链接无法按预期工作

时间:2016-09-29 05:19:58

标签: java android regex word-boundary

我需要在Android应用中突出搜索主题标签的结果。我的搜索字词是“#fun”。

示例字符串:“#fun #funny#fun123 #funtimes#fun#hi”

所需的输出:“ #fun #funny#fun123 #funtimes #fun #hi”

我尝试了以下内容 -

Pattern.compile(searchTerm + "\\b");

其中searchTerm为“#fun”。

结果:“ #fun #fun ny#fun123 #fun #fun #hi”< / p>

字边界是否应该停止像“#funny”这样的字符串中的子串高亮?

这就是我正在应用正则表达式的方式:

private void addLinkToSpan(Spannable s, Link link) {
        Pattern pattern = Pattern.compile(searchTerm + "\\b");
        Matcher matcher = pattern.matcher(mText);

        while (matcher.find()) {

            int start = matcher.start();

            if (start >= 0) {
                int end = start + link.getText().length();

                applyLink(link, new ClickableLinkSpan.Range(start, end), s);
            }
        }
    }

private void applyLink(final Link link, final ClickableLinkSpan.Range range, Spannable text) {
        ClickableLinkSpan linkSpan = new ClickableLinkSpan(link, range);
        text.setSpan(linkSpan, range.start, range.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        StyleSpan styleSpan = new StyleSpan(link.getTextStyle().ordinal());
        text.setSpan(styleSpan, range.start, range.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

1 个答案:

答案 0 :(得分:0)

您需要将matcher.start()matcher.end()传递给ClickableLinkSpan.Range方法:

while (matcher.find()) { 
    applyLink(link, new ClickableLinkSpan.Range(matcher.start(), matcher.end()), s); 
}

matcher.start()包含输入字符串中匹配值起始位置的确切索引,matcher.end()包含当前匹配的结束索引。