我有两个字符串列表。现在,我想用句子索引i的第二个列表中的单词替换索引i中第一个列表中的每个单词出现。
如果我有
list a=("am","I","my")
和
list b=("are","You","your")
我想要一句话“我是一个业余爱好者” 成为“你是一个业余爱好者”
在Kotlin中最干净的方法是什么(没有for循环)?
答案 0 :(得分:0)
您可以使用正则表达式\b\w+\b
来匹配句子中的单词,然后使用lambda调用replace
函数,该lambda为每次匹配提供替换字符串:
val input = "I am an amateur, alas."
val wordsToReplace = listOf("I", "am", "my")
val wordsReplaceWith = listOf("You", "are", "your")
val wordRegex = """\b\w+\b""".toRegex()
val result = wordRegex.replace(input) { match ->
val wordIndex = wordsToReplace.indexOf(match.value)
if (wordIndex >= 0) wordsReplaceWith[wordIndex] else match.value
}
println(result)
如果列表中有很多单词,那么为它们建立地图以加快搜索速度是很有意义的:
val replaceMap = (wordsToReplace zip wordsReplaceWith).toMap()
val result = wordRegex.replace(input) { match ->
replaceMap[match.value] ?: match.value
}
答案 1 :(得分:0)
首先将字符串分成单词列表,然后将列表a
中存在的每个单词映射到列表b
中的相应单词。最后重新加入字符串:
val a= listOf("am","I","my")
val b= listOf("are","You","your")
val str = "I am an amateur"
val new = str
.split("\\s+".toRegex())
.map { val i = a.indexOf(it); if (i < 0) it else b[i] }
.joinToString(" ")
做同一件事的另一种方法是:
var new = " $str "
a.forEachIndexed { i, s -> new = new.replace(" $s ", " ${b[i]} ") }
new = new.trim()
尽管这更接近for循环。
答案 2 :(得分:0)
我认为没有标点符号,所有空格都是空格,依此类推。
val m = a.zip(b).toMap()
return s.split(' ').joinToString(" ") { m[it] ?: it }
首先,您要创建地图m
,以提高效率。然后
m
包含单词,则返回值(即替换),否则返回原始单词(因为我们不应该替换它)。答案 3 :(得分:0)
我认为最简单的方法是创建所需的一组正则表达式,然后通过迭代替换字符串。假设您要替换单词“ am”,则正则表达式将为“ \ bam \ b”。如果您希望它不区分大小写,则可以使用“(?i)\ bam \ b”。将“我是业余爱好者”改为“你是业余爱好者”
val replacements = setOf("\\bam\\b" to "are",
"\\bI\\b" to "You",
"\\bmy\\b" to "your")
replacements.forEach {
str = str.replace(Regex(it.first), it.second)
}