我有一个可变的字符串列表,我正在尝试从每个字符串中删除一个单词。问题是我不相信从每一行中都删除了这个词。
for (item in stringLines) {
when {
item.contains("SUMMARY") -> eventLines.add(item)
item.contains("DTSTART") -> startDateLines.add(item)
item.contains("DTEND") -> endDateLines.add(item)
//item.contains("URL:") -> locationLines.add(item)
//item.contains("CATEGORIES") -> categoriesLines.add(item)
}
}
for (item in eventLines) {
when{
item.contains("SUMMARY") -> item.removePrefix("SUMMARY")
}
}
字符串是
SUMMARY WINTER FORMAL
我需要
WINTER FORMAL
,但是无论出于什么原因都没有出现。我知道如何在Java中执行此操作,但是我不知道如何在Kotlin中执行此操作,并且找不到任何能够完成此操作的函数。我想念什么?
答案 0 :(得分:3)
removePrefix
仅在字符串的特定部分为前缀的情况下才将其删除。显然,这不是您的情况。您可以执行split
,filter
,join
序列以产生预期的结果。
println("SUMMARY WINTER FORMAL".split(" ").filter { it != "SUMMARY" }.joinToString(" "))
//output : "WINTER FORMAL"
但是,如果您有多个连续的空格,它们将在输出中变成一个空格。如果“ SUMMARY”没有被空格包围,例如“ SUMMARYWINTERFORMAL”将不会更改。
您可以通过将其替换为空字符串来删除部分字符串,但是请注意,这会保留所有周围的字符,包括周围的空格。
println("SUMMARY WINTER FORMAL".replace("SUMMARY",""))
//output : " WINTER FORMAL"
请注意,“冬季”前面有一个空格
如果您不希望包含空格,则使用正则表达式可以:
println("SUMMARY WINTER FORMAL".replace("\\s*SUMMARY\\s*".toRegex(),""))
//output : "WINTER FORMAL"
println("SUMMARYWINTERFORMAL".replace("\\s*SUMMARY\\s*".toRegex(),""))
//output : "WINTERFORMAL"
println(" SUMMARY WINTER FORMAL".replace("\\s*SUMMARY\\s*".toRegex(),""))
//output : "WINTER FORMAL"
您甚至可以修改正则表达式以更好地适合您的用例。
答案 1 :(得分:3)
Kotlin(和Java)中的字符串是不可变的。因此item.removePrefix
返回一个新的字符串,您必须更新列表或创建一个新列表,如下所示:
for (item in eventLines) {
when {
item.contains("SUMMARY") ->
eventLinesWithPrefixRemoved.add(item.removePrefix("SUMMARY"))
else -> eventLinesWithPrefixRemoved.add(item)
}
}
答案 2 :(得分:0)
如果您只想从字符串中删除“ SUMMARY”,则可以使用这种情况
val l = listOf("SUMMARY WINTER FORMAL", "SUMMARY FORMAL", "WINTER FORMAL", "SUMMARY WINTER")
println(
l.map {
it.split(" ")
.filter { s -> s != "SUMMARY" }
.joinToString(" ")
}
) // puts [WINTER FORMAL, FORMAL, WINTER FORMAL, WINTER]