替换Kotlin中字符串中的出现

时间:2019-04-21 23:07:58

标签: list arraylist kotlin replace

我有两个字符串列表。现在,我想用句子索引i的第二个列表中的单词替换索引i中第一个列表中的每个单词出现。

如果我有

list a=("am","I","my")

list b=("are","You","your")

我想要一句话“我是一个业余爱好者” 成为“你是一个业余爱好者”

在Kotlin中最干净的方法是什么(没有for循环)?

4 个答案:

答案 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,以提高效率。然后

  1. 分割字符串以获取单词列表
  2. 映射所有单词:如果m包含单词,则返回值(即替换),否则返回原始单词(因为我们不应该替换它)。
  3. 加入所有单词,用空格隔开。

答案 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)
}