You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以更地道的Kotlin写法优化字符串查找与替换逻辑

Kotlin代码优化:提取<b>标签内容并移除标签

需求说明

现有包含<b>标签的字符串,需要完成两个操作:

  1. 提取所有<b>与</b>之间的文本内容
  2. 移除原字符串中的所有<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:28:40