2017-09-01 51 views
2

我想从字符串中替换多个匹配。多重匹配并在SpanableString中替换android

这是我的代码。

SpannableStringBuilder ss = new SpannableStringBuilder(str); 
Pattern userNamePattern = Pattern.compile("\\[(.*?)\\]"); 
Matcher userNameMatcher = userNamePattern.matcher(ss); 
while (userNameMatcher.find()) { 
    final int start = userNameMatcher.start(); 
    final int end = userNameMatcher.end(); 
    ss.setSpan(new ClickableSpan() { 
     final String clickString = str.substring(start,end); 
     @Override 
     public void onClick(View widget) { } 

     @Override 
     public void updateDrawState(TextPaint ds) { 
      super.updateDrawState(ds); 
      ds.setUnderlineText(false); 
     } 
    }, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

    ss.replace(start, end, str.substring(start+1,end-1)); 
} 

它取代文字,但不给最好的结果。
例如,如果测试是[A] b [cd] e那么结果是A b [ccd 我需要的结果是A b cd e
我该如何做到这一点我在这里做错了。

+0

由于您正在尝试在此处进行标记,因此您当前的输入和预期输出并不能说明整个故事。在这种情况下,您可能实际上需要包含几个小屏幕捕获来说明发生了什么。 –

+0

什么屏幕捕捉它的完整问题。预期的输出不返回。 – PakDeveloper

+0

请参阅https://pastebin.com/raw/w2Fx2cdq – pskink

回答

1

作为@pskink解释代码Here您可以使用它这样的东西。我希望这个为你工作。

SpannableStringBuilder ss = new SpannableStringBuilder(str); 
Pattern userNamePattern = Pattern.compile("\\[(.*?)\\]"); 
Matcher userNameMatcher = userNamePattern.matcher(ss); 
int delta = 0; 
while (userNameMatcher.find()) { 
    final int start = userNameMatcher.start() - delta; 
    final int end = userNameMatcher.end() - delta; 
    ss.setSpan(new ClickableSpan() { 
     final String clickString = str.substring(start,end); 
     @Override 
     public void onClick(View widget) { } 

     @Override 
     public void updateDrawState(TextPaint ds) { 
      super.updateDrawState(ds); 
      ds.setUnderlineText(false); 
     } 
    }, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

    ss.delete(end - 1, end); 
    ss.delete(start, start + 1); 
    delta += 2; 
}