从字符串中删除不必要的部分

时间:2018-10-29 14:28:09

标签: kotlin

我正在使用一个无法更改的客户端,它向我发送了如下数据:

"BOOKING - PAID (price.amount=70, price.currency=EUR)"

,我只想从中获取70 EUR

在Kotlin中做这种事情的最好方法是什么?我没有找到String的任何removeAll("", "", ...)函数,只能替换但必须链接它们以同时删除price.amountprice.currency

编辑:

实际上需要预订-付费(70 EUR),忘了那部分。

3 个答案:

答案 0 :(得分:2)

这听起来像是正则表达式的工作!

fun main(args: Array<String>) {
    val str = "BOOKING - PAID (price.amount=70, price.currency=EUR)"

    // The expressions between parentheses will map to groups[1], groups[2] and groups[3] respectively
    val reg = Regex("""(.*) \(price\.amount=([0-9]+), price\.currency=([A-Z]+)\)""")


    // Apply the regular expression on the string
    val results = reg.find(str)

    results?.groupValues?.let { groups ->
        // If results and groupValues aren't null, we've got our values!
        val type = groups[1]
        val price = groups[2]
        val currency = groups[3]

        println("$type ($price $currency)") // BOOKING - PAID (70 EUR)
    }

    // Or as suggested by @Roland:
    results?.destructured?.let { (type, price, currency) ->
        println("$type ($price $currency)") // BOOKING - PAID (70 EUR)
    }
}

使用正则表达式可以将字符串作为条目,并在其中查找模式。它们在所有语言中都已广泛使用,您可以在各地找到有关它们的更多信息。

编辑:针对更新的问题进行编辑。我选择将"BOOKING - PAID"视为单个字符串,但是有无数种方法可以实现,具体取决于您的粒度需求;老实说,在这一点上,正则表达式可能有点过大了。 :)

答案 1 :(得分:2)

考虑一下,当您更新问题以仅从字符串中真正删除一部分时,以下是从给定字符串中删除多个字符串的一些方法:

使用正则表达式:

input.replace("""(price\.(amount|currency)=|,)""".toRegex(), "")

使用要删除的字符串列表:

sequenceOf(input, "price.amount=", ",", "price.currency=")
    .reduce { acc, rm -> acc.replace(rm, "") }
// alternatively using var:
var input = TODO()
sequenceOf("price.amount=", ",", "price.currency=")
    .forEach { input = input.replace(it, "") }

还是:大多数时候,我宁愿走另一条路:提取所需的信息,然后像Baptiste has shown in his answer那样打印出来。否则,您可能会开始公开您不想公开的服务的答案。

答案 2 :(得分:1)

没有通过字符串操作的正则表达式,并假定这是模式:

fun main(args: Array <String> ) {
    val str = "BOOKING - PAID (price.amount=70, price.currency=EUR)"

    val type = str.substringBefore("(").trim()
    val price =  str.substringBeforeLast(",").substringAfter("=")
    val currency = str.substringAfterLast("=").substringBefore(")")

    val result = "$type ($price $currency)"

    println(result)
}

将打印

BOOKING - PAID (70 EUR)

编辑:我使用str.substringBeforeLast(",")来获取价格,以防,可以用作数字中小数部分的分母