【问题标题】:How to adjust index in a string after removing some characters?删除某些字符后如何调整字符串中的索引?
【发布时间】:2020-05-13 19:02:46
【问题描述】:

我对正则表达式和文本操作非常陌生,所以这对许多人来说可能是微不足道的,但对我来说却是相当麻烦的。

我有一个这样的字符串:

*文本*文本文本文本*文本*

其中的文本 b/w * 表示必须为粗体的文本
所以想要的输出是

文本文本文本文本文本

我使用以下代码已经完成了一半

 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
    }

现在的输出是
*text* text text text *text*(*s 也是粗体)
我想删除 * 的
我打算使用

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

删除 * 之后,我无法调整需要传递的索引。我该怎么做?或者,还有更好的方法?非常感谢任何帮助

【问题讨论】:

    标签: android regex textview spannablestring


    【解决方案1】:

    我用 JavaScript 实现了你想要的。它应该与您使用的语言有些相似。

    正则表达式解释:

    • 找到*
    • 在星号([^*]+)之间捕获一个或多个非*字符
    • 找第二个*
    • 捕获所有匹配的g标志
    • 用捕获的组$1(和标签)替换匹配项。

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

    PS:如果你在字符串中省略了strong 标签,它只会删除*

    【讨论】:

      【解决方案2】:

      IMO 你真的不需要正则表达式来解决你的问题(有一句名言“如果你想用正则表达式解决一个问题,现在你有两个问题”,我经常使用正则表达式来表示同意和不同意)。

      您可以在循环中使用String 中的indexOf 方法(JavaKotlin)来查找*s,同时在SpannableStringBuilder 中构造最终结果:

      • 保留一个指向当前跨度起点的变量(如果没有开放跨度,则为 -1)。
      • 在每次迭代中,您从找到的最后一个索引开始使用indexOf
      • 每次您找到一个开口* 时,您都会将最后一个位置的文本附加到您的构建器的当前位置。
      • 每次找到结束符 * 时,都会将开始符 * 的文本附加到更接近符处,并将其设置为粗体。
      • 如果您在迭代中没有找到 *,则将最后一站的所有内容附加到构建器中
      • 如果您到达字符串的末尾并且有一个从未关闭的打开的*,您就知道您有一个错误。您可以应用或不应用粗体跨度(或throw)。

      希望这会有所帮助。

      另外,请不要使用指向您的链接的其他问题。

      【讨论】:

      • highjack..我喜欢那个声音:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多