android - 修改大字符串的内容

标签 android string kotlin recursion

我收到一些大型字符串内容,其中包含多个划分部分的数字。
我试图以这样的方式修改内容:如果存在数字,则插入换行符。

因此,类似于:“1.这是一行。2.这是另一行。3.这是另一行。”

修改为如下内容:
“1.这是一行。
2.这是另一行。
3.这是另一行。”

我尝试这样解决:

fun modifyText(inputStr: String):String {
        val marker= listOf('1', '2', '3', '4', '5', '6', '7')
        var text = ""
       marker.forEach {
           if (inputStr.contains(it)) {
               text = inputStr.replace(it.toString(), "\n $it" )
           }
       }
       return text
}

这仅修改了最后一个数字的部分,而不是所有内容。 以这种方式使用递归的想法:

tailrec fun modifyText(inputStr: String):String {
        val marker= listOf('1', '2', '3', '4', '5', '6', '7')
        var text = ""
       marker.forEach {
           if (inputStr.contains(it)) {
               text = inputStr.replace(it.toString(), "\n $it" )
           }
       }
       return modifyText(text)
} 
but ended up "bricking" the app.
Please any solutions to how this can be achieved will be appreciated.

最佳答案

您的第二次尝试“使应用程序变砖”,因为您正在编写一个具有无限递归的函数(它调用自身但没有停止条件)。这通常会因StackOverflowError而失败,但对于tailrec,您可能最终会陷入无限循环 - 也好不了多少。

在您的情况下不需要递归,replace() 将处理匹配字符串的所有出现。

第一次尝试时的问题是 text = inputStr.replace(it.toString(), "\n $it") 始终重用初始的 inputStr修改后的文本。因此,您已经进行的所有替换都不会被考虑在内,并且只有最后一个“标记”(7)的替换才有效。 您可以通过使用 text 而不是 inputStr 来更改它,并将 text 初始化为 inputStr:

fun modifyText(inputStr: String):String {
    val marker= listOf('1', '2', '3', '4', '5', '6', '7')
    var text = inputStr
    marker.forEach {
        if (inputStr.contains(it)) {
            text = text.replace(it.toString(), "\n $it" )
        }
    }
    return text
} 

请注意,为此您还可以直接使用正则表达式,而无需手动列出所有数字。它可能会更高效,更重要的是它更简单:

val modifiedStr = inputStr.replace(Regex("""\d"""), "\n $0")

如果您不熟悉正则表达式,则会发生以下情况:

  • \d 匹配单个数字
  • 替换字符串中的
  • $0 表示匹配组 0 的值,即整个匹配(因此,正则表达式匹配的数字)。如果正则表达式中有括号,则每对括号定义一个新组(编号为 1、2、3 等)。

如果您想匹配后跟 . 的数字,您还可以改进此正则表达式(在您的输入中,它看起来总是后跟 .,因此可以避免匹配非节号的数字):

val modifiedStr = inputStr.replace(Regex("""\d\."""), "\n $0")

最后一项改进,如果您的部分编号超过 1 位,则可以使用 + 修饰符来指示“一个或多个”:

val modifiedStr = inputStr.replace(Regex("""\d+\."""), "\n $0")

关于android - 修改大字符串的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67426278/

相关文章:

android studio 模拟器无法初始化 DirectSoundCapture

enums - 在 Kotlin 中向现有枚举添加属性

kotlin - 使用密封类强制编译错误

android - xml 文件中的错误

java - 将 Excel 公式的文件名括起来

java - Android 隐藏来自 Firebase 的通知

C-char指针和char指针字符串管理

string - 对于带有负号的数字,正确的模式是什么?

android - 未为多个布局文件夹生成数据绑定(bind)类

java - 使用 Java 的 Android 填字游戏算法