Как настроить индекс в строке после удаления некоторых символов? - PullRequest
0 голосов
/ 28 января 2020

Я очень плохо знаком с регулярными выражениями и манипуляциями с текстом, поэтому для многих это может быть тривиально, но для меня это довольно неприятно.

У меня есть такая строка:

* текст * текст текст текст * текст *

где текст ч / б * обозначает текст, который должен быть выделен жирным шрифтом
Таким образом, желаемый результат будет

текст текст текстовый текст текст

Я на полпути, используя следующий код

 val string = "*text* text text text *text*"
        val pattern = Pattern.compile("\\*")
        val matcher = pattern.matcher(string)
        val spannableString = SpannableString(string)
        var counter = 0
        val indexes = IntArray(1)

        while (matcher.find()) {
                if(counter==0){
                    indexes[0]=matcher.start()
                    counter+=1
                }else if(counter==1){
                spannableString.setSpan(
                    StyleSpan(Typeface.BOLD),
                    indexes[0],matcher.start(),
                    Spannable.SPAN_INCLUSIVE_EXCLUSIVE)
               counter+=1

            }
            if(counter==2){
                counter=0
            }
        }
        textView.text = spannableString
    }

В настоящее время вывод
* текст * текст текст текст * текст * (* также выделены жирным шрифтом)
Я хочу удалить
Я собираюсь использовать

val spannableString = SpannableString(string.replace("*",""))

, чтобы удалить *, но после этого я не возможность настроить индексы, которые необходимо передать. Как это сделать? или есть лучший способ? Любая помощь с благодарностью

Ответы [ 2 ]

0 голосов
/ 29 января 2020

IMO, вам не нужно регулярное выражение для решения вашей проблемы (есть известная поговорка "Если вы пытаетесь решить проблему с RegEx, теперь у вас есть 2 проблемы" , и я использую RegExs достаточно часто, чтобы соглашаться и не соглашаться).

Вы можете использовать метод indexOf в String в oop (Java, Kotlin ) чтобы найти * s, при построении конечного результата в SpannableStringBuilder :

  • Сохранить переменную, указывающую на начало текущего диапазона (или - 1, если открытых промежутков нет).
  • На каждой итерации вы используете indexOf, начиная с последнего найденного индекса.
  • Каждый раз, когда вы обнаруживаете открытие *, вы добавляете текст из Последняя позиция текущей текущей для вашего строителя.
  • Каждый раз, когда вы находите закрывающий *, вы добавляете текст из отверстия * ближе и устанавливаете его как жирный интервал.
  • Если вы не нашли * на итерации, вы добавляете все от последней остановки к строителю
  • Если вы достигли конца строки и открыли *, которое никогда не было закрыто, вы знаете, что произошла ошибка. Вы можете применить жирный интервал или нет (или throw).

Надеюсь, это поможет.

Также, пожалуйста, не угоняйте другие вопросы со ссылками на ваши.

0 голосов
/ 28 января 2020

Я реализовал то, что вы хотели в JavaScript. Это должно быть несколько похоже на язык, который вы используете.

Регулярное объяснение объяснило:

  • найдите *
  • захватите один или несколько не * символы между звездочками ([^*]+)
  • найти секунду *
  • захватить все совпадающие g флаг
  • заменить совпадения захваченной группой $1 (и теги).

let string = '*text* text text text *text*';
string = string.replace(/\*([^*]+)\*/g, '<strong>$1</strong>');
document.getElementById('span').innerHTML = string;
<span id='span'></span>

PS: если вы опустите теги strong в строке, он просто удалит *.

...