2013-06-02 9 views
2

Я хочу сделать заявку о regex. Пользователь вводит регулярное выражение и тестовый текст, и я хочу выделить все в тестовом тексте, который соответствует регулярному выражению. Теперь я сделал что-то вроде этого:Выделите текст в TextView, который может содержать HTML-теги

// txaTestText is an EditText 
Editable testText = txaTestText.getText(); 

// pattern is a java.util.regex.Pattern input by user 
Matcher matcher = pattern.matcher(testText); 

// txaFindResult is a TextView 
txaFindResult.setText(Html.fromHtml(matcher 
     .replaceAll("<font color=\"red\">$0</font>"))); 

Проблема заключается в том, что пользователь может ввести некоторую строку, включая теги HTML, в качестве тестового текста. Например:

  • регулярное выражение = o
  • тест текст = Hello<br>world
  • ожидаемый результат = Hello<br>world (С StackOverflow не поддерживают окраску, я использую полужирный здесь вместо)
  • реальный результат = Hello
    world

Я попытался использовать Html.escapeHtml. Однако он добавлен в уровень API 16, в то время как мой минимальный размер составляет 8.

Мой вопрос заключается в том, как решить проблему выше?

+0

Вы можете попробовать заменить '<' на '<' и '>' с '>'. – HamZa

+0

Если регулярное выражение '' 'и тестовый текст' < <', это пойдет не так. – johnchen902

+0

Я говорю о результате, поэтому вы должны заменить это в результате, а не на ввод. – HamZa

ответ

2

Вы должны использовать Spans:

Spannables может быть использован для альтернативных частей текста TextView в: например, цвет с ForeGroundColorSpan. Его можно даже использовать для введения изображения с текстом (смайлики в текстовом сообщении).

вот пример жесткого кодирования с подсветкой части <br>. Вы должны добавить регулярное выражение algorithme:

MainActivity.java

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     TextView textView = (TextView)findViewById(R.id.helloworld); 
     Spannable spannableString = new SpannableString(getString(R.string.hello_world));   
     spannableString.setSpan(new ForegroundColorSpan(Color.RED), 5, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     textView.setText(spannableString); 

    } 

strings.xml

<string name="hello_world"> 
    <![CDATA[ 
    Hello <br> World 
    ]]> 
</string> 

main.xml

<TextView 
    android:id="@+id/helloworld" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    android:text="@string/hello_world" /> 

Screenshot highlight <br> tag

Смежные вопросы