突出显示方括号内的文本(正则表达式?)Android kotlin
Highlight text within square bracket (regex ?) Android kotlin
我想突出显示方括号内的所有子字符串,例如:“[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()
时,高亮被删除。
另外,高亮是用索引做的,我不想提取子串,而是放在原串里,不知道应该用什么优化方式。
有结果:
也许最好不要使用 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
结果:
我想突出显示方括号内的所有子字符串,例如:“[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()
时,高亮被删除。
另外,高亮是用索引做的,我不想提取子串,而是放在原串里,不知道应该用什么优化方式。
有结果:
也许最好不要使用 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
结果: