Kotlin中字符串句号替换为换行符失效的解决求助
问题解决:Kotlin中替换句号为换行符
核心问题
你当前的代码使用了字符串字面量版本的replace方法,它不会将第一个参数解析为正则表达式,导致匹配逻辑失效。要实现正则替换,必须使用支持正则的重载方法。
修正方案
方案1:使用Regex对象
val input = meal.directions val formattedDirections = input.replace(Regex("\\.\\s?"), ".\n")
方案2:将字符串转为Regex对象
val input = meal.directions val formattedDirections = input.replace("""\.\s?""".toRegex(), ".\n")
额外优化:统一处理原有换行符
原文本中存在\r\n格式的换行,可先统一转换为标准换行再处理:
val input = meal.directions.replace("\r\n", "\n") val formattedDirections = input.replace(Regex("\\.\\s?"), ".\n")
原理说明
- Kotlin的
String.replace(String, String)是字面量匹配替换,会把你传入的"\\.\\s?"当作普通字符串(即匹配\.\s?这几个字符),而非正则表达式,因此无法匹配到实际的句号加空格。 - 只有通过
Regex类或toRegex()方法将字符串转为正则表达式对象,才能让\.\s?的正则逻辑生效(匹配句号后跟可选空白字符)。
非正则替代方案
如果不想使用正则,也可以通过遍历字符串手动处理:
val input = meal.directions.replace("\r\n", "\n") val sb = StringBuilder() input.forEachIndexed { index, c -> sb.append(c) when { c == '.' && index < input.length - 1 && input[index + 1].isWhitespace() -> sb.append('\n') c == '.' && index == input.length - 1 -> sb.append('\n') } } val formattedDirections = sb.toString()
内容的提问来源于stack exchange,提问作者Tonnie
相关产品推荐
相关产品推荐

