2016-09-29 7 views
1

Androidアプリで検索したハッシュタグの結果を強調表示する必要があります。検索用語が「#fun」であるとします。正規表現ベースのリンキングが期待通りに機能しない

サンプル文字列: "#fun #funny#fun123 #funtimes#楽しい#HI"

所望の出力: "#fun #funny#fun123 #funtimes #fun #hi"

私は以下を試しました -

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

ここでsearchTermは "#fun"です。

結果: "#fun#fun NY#fun123 #fun#fun #hi"

は、ワード境界は#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); 
    } 
+0

完全なコードを教えてください。 – TheLostMind

+1

'\ b'は正しく動作します。 https://regex101.com/r/3jYEoy/1 – vks

+0

代わりにこれを使用し、それが動作するかどうかを確認してください: Pattern.compile(searchTerm + "[^ \\ d \ w]"); – Alikbar

答えて

0

あなたがClickableLinkSpan.Range方法にmatcher.start()matcher.end()を渡す必要があります:

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

matcher.start()は試合の正確なインデックスが含まれています入力ストリング内の開始位置の値がmatcher.end()で、現在の一致の終了インデックスが保持されます。

関連する問題