我收到一些大型字符串内容,其中包含多个划分部分的数字。
我试图以这样的方式修改内容:如果存在数字,则插入换行符。
因此,类似于:“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/