如何在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
相关产品推荐
相关产品推荐

