如何以更地道的Kotlin写法优化字符串查找与替换逻辑
Kotlin代码优化:提取
<b>标签内容并移除标签 需求说明
现有包含<b>标签的字符串,需要完成两个操作:
- 提取所有
<b>与</b>之间的文本内容 - 移除原字符串中的所有
<b>和</b>标签
原实现代码如下:
private const val BOLD_PATTERN = "<b>(.*?)</b>" fun main() { val message = "Hello, How are you? My Name is <b>Xyz</b>. <b>Abc</b> your next score will be 100 to win the game." val itemList = findAndGetBoldList(message) val filterMessage = message.replace("<b>", "").replace("</b>", "") itemList.forEach { println("Bold part is :- $it") } println(filterMessage) } fun findAndGetBoldList(message: String): List<String> { return BOLD_PATTERN .toRegex() .findAll(message) .map { it.value.replace("<b>", "").replace("</b>", "") } .toList() }
优化后的Kotlin惯用写法
// 提前编译正则表达式,避免重复编译开销 private val BOLD_PATTERN = "<b>(.*?)</b>".toRegex() fun main() { val message = "Hello, How are you? My Name is <b>Xyz</b>. <b>Abc</b> your next score will be 100 to win the game." // 提取标签内内容:直接取正则捕获组 val boldContentList = BOLD_PATTERN.findAll(message) .map { it.groupValues[1] } .toList() // 移除标签:一次性替换整个<b>...</b>为捕获到的内容 val filteredMessage = BOLD_PATTERN.replace(message) { it.groupValues[1] } boldContentList.forEach { println("Bold part is :- $it") } println(filteredMessage) } // 如需复用提取逻辑,可封装为表达式体函数 fun getBoldContentList(message: String): List<String> = BOLD_PATTERN.findAll(message).map { it.groupValues[1] }.toList()
优化点说明
- 直接利用正则捕获组:原代码通过两次
replace去除标签来获取内容,优化后直接读取正则的捕获组结果(groupValues[1]),逻辑更清晰且减少不必要的字符串操作。 - 高效移除标签:用一次正则替换完成所有标签的移除,替代原代码两次独立的
replace调用,减少字符串处理次数。 - 提前编译正则:将正则表达式提前编译为
Regex实例并作为常量,避免每次调用时重复编译,提升性能。 - 简化函数写法:使用Kotlin的表达式体函数替代传统的块体函数,让代码更简洁紧凑。
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

