突出显示方括号内的文本(正则表达式?)Android kotlin

Posted

技术标签:

【中文标题】突出显示方括号内的文本(正则表达式?)Android kotlin【英文标题】:Highlight text within square bracket (regex ?) Android kotlin 【发布时间】:2020-11-11 23:10:12 【问题描述】:

我想突出显示方括号内的所有子字符串,例如:“[Toto] 正在同时 [做很多] 事情。” 我知道如何extract it。 我知道如何强调:

val str = SpannableString("Toto is doing a lot of stuff at the same time.")
str.setSpan(BackgroundColorSpan(Color.YELLOW), 0, 4, 0)
str.setSpan(BackgroundColorSpan(Color.YELLOW), 8, 22 , 0)
textView.text = str

但问题是我不知道如何同时实现两者。

我显然想在应用高亮效果后删除方括号,但是当我执行 toString() 时,replace() 高亮被删除。

另外,高亮是用索引做的,我不想提取子字符串,而是把它放在原始字符串中,我不知道我应该通过哪种优化方式来实现。

结果如下:

【问题讨论】:

“但是当我执行 toString() 时,replace() 会移除高亮”——所以,不要使用toString()。尝试使用函数 on TextUtils,因为它们与 CharSequence 一起使用,并且通常保持跨度完好无损。 【参考方案1】:

也许最好不要使用regex 来提取右括号之间的文本。我认为这增加了这项工作的复杂性。对文本使用简单的迭代,我们可以实现线性复杂度的结果。

val text = "[Toto] is [doing a lot of] stuff at the same time."

val spanStack = Stack<Pair<Int, Int>>()
var index = 0

text.forEach 
    when (it) 
        '[' -> spanStack.push(index to index)
        ']' -> spanStack.push(spanStack.pop().first to index)
        else -> index++
    


val spannableString = text
    .replace("[\\[\\]]".toRegex(), "")
    .let  SpannableString(it) 
    .apply 
        spanStack.forEach 
            setSpan(
                BackgroundColorSpan(Color.YELLOW),
                it.first,
                it.second,
                SpannableString.SPAN_INCLUSIVE_INCLUSIVE
            )
        
    

textView.text = spannableString

结果:

【讨论】:

感谢您的帮助! ?。这正是我想要的!

以上是关于突出显示方括号内的文本(正则表达式?)Android kotlin的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式用于选择花括号内的双引号而忽略外部的引号

如何使用正则表达式删除括号内的文本?

用于匹配嵌套括号内的特定文本的 C# 正则表达式

正则表达式用于匹配 img 标记的开始和结束尖括号内的所有文本

正则表达式获取方括号之间的文本,包括差异?

正则表达式提取方括号或大括号之间的文本