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

如何在Kotlin中使用readln()将多行字符串读取到一个变量中?

Kotlin 多行输入处理:移除特殊字符、制表符及多余空格

需求说明

需要实现用Kotlin读取多行输入字符串到单个变量中,同时完成以下清理操作:

  • 移除所有特殊字符(如横线、括号等非字母数字/空格的字符)
  • 移除制表符
  • 去除多余空格(包括行内连续空格、首尾空格、空行)

原示例代码仅支持单行读取,以下是适配多行输入的实现方案:


方案1:合并所有内容为单行无多余空格

该方案会将所有行合并为一行,同时清理所有无效内容:

// 读取所有多行输入(控制台按Ctrl+D/Ctrl+Z结束输入)
val inputLines = generateSequence { readlnOrNull() }.toList()
// 合并所有行并依次清理内容
val processedStr = inputLines.joinToString("\n")
    .replace("\t", "") // 移除制表符
    .replace("[^A-Za-z0-9 \n]".toRegex(), "") // 移除特殊字符
    .replace("\\s+".toRegex(), " ") // 将连续空白(含换行)替换为单个空格
    .trim() // 去除首尾空格

println(processedStr)

测试示例

输入示例1:

heading
----------
topic1

topic2

处理后输出:heading topic1 topic2

输入示例2:

heading
-------
a) topic1

b) topic2

处理后输出:heading topic1 topic2


方案2:保留有效行结构(去除空行及行内多余空格)

如果需要保留每行的独立结构,仅清理空行和无效内容:

// 读取所有多行输入
val inputLines = generateSequence { readlnOrNull() }.toList()
// 逐行清理并过滤空行
val processedStr = inputLines
    .map { line ->
        line.replace("\t", "") // 移除制表符
            .replace("[^A-Za-z0-9 ]".toRegex(), "") // 移除特殊字符
            .replace("\\s+".toRegex(), " ") // 行内连续空格替换为单个空格
            .trim() // 去除行首尾空格
    }
    .filter { it.isNotEmpty() } // 过滤空行
    .joinToString("\n") // 重新组合为多行字符串

println(processedStr)

测试示例

输入示例1处理后输出:

heading
topic1
topic2

输入示例2处理后输出:

heading
topic1
topic2

代码说明

  • generateSequence { readlnOrNull() }:通过生成序列的方式循环读取每行输入,直到输入结束(控制台输入终止符)。
  • 正则[^A-Za-z0-9 \n]:匹配所有非字母、数字、空格和换行的字符,确保只保留有效内容。
  • 正则\\s+:匹配任意连续空白字符(空格、换行、制表符等),统一替换为单个空格或直接过滤。

内容的提问来源于stack exchange,提问作者Anil kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:01:17