Kotlin 从字符串中删除不必要的部分
我正在使用一个无法更改的客户端,它向我发送的数据如下所示:Kotlin 从字符串中删除不必要的部分,kotlin,Kotlin,我正在使用一个无法更改的客户端,它向我发送的数据如下所示: "BOOKING - PAID (price.amount=70, price.currency=EUR)" 我只想从中提取70欧元 在科特林做这件事最好的方法是什么?我没有找到任何用于字符串的removeAll(“,”,…)函数,仅替换,但必须将它们链接起来以删除price.amount和price.currency 编辑: 需要付费预订(70欧元),实际上,忘了这一部分。这听起来像是正则表达式的工作 fun main(args:
"BOOKING - PAID (price.amount=70, price.currency=EUR)"
我只想从中提取70欧元
在科特林做这件事最好的方法是什么?我没有找到任何用于字符串的removeAll(“,”,…)
函数,仅替换,但必须将它们链接起来以删除price.amount
和price.currency
编辑:
需要付费预订(70欧元),实际上,忘了这一部分。这听起来像是正则表达式的工作
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)
}
}
fun main(args:Array){
val str=“预订-已付(价格.金额=70,价格.货币=欧元)”
//括号之间的表达式将分别映射到组[1]、组[2]和组[3]
val reg=Regex(“”(.*)\(价格\金额=([0-9]+),价格\货币=([A-Z]+)\)
//在字符串上应用正则表达式
val结果=注册查找(str)
结果?.groupValues?.let{groups->
//如果results和groupvalue不为null,我们就得到了我们的值!
val类型=组[1]
val价格=组[2]
val货币=组[3]
println($type($price$currency)///预订-已支付(70欧元)
}
//或者按照@Roland的建议:
结果?.destructured?.let{(类型、价格、货币)->
println($type($price$currency)///预订-已支付(70欧元)
}
}
正则表达式允许您将字符串作为条目,并在其中查找模式。它们在所有语言中都很常用,你可以在各地找到更多关于它们的信息
编辑:针对更新的问题进行编辑。我选择将
“预订-付费”
视为一个字符串,但根据您的粒度需求,有无数种方法可以做到这一点;老实说,在这一点上,正则表达式可能有点矫枉过正 这听起来像是正则表达式的工作
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)
}
}
fun main(args:Array){
val str=“预订-已付(价格.金额=70,价格.货币=欧元)”
//括号之间的表达式将分别映射到组[1]、组[2]和组[3]
val reg=Regex(“”(.*)\(价格\金额=([0-9]+),价格\货币=([A-Z]+)\)
//在字符串上应用正则表达式
val结果=注册查找(str)
结果?.groupValues?.let{groups->
//如果results和groupvalue不为null,我们就得到了我们的值!
val类型=组[1]
val价格=组[2]
val货币=组[3]
println($type($price$currency)///预订-已支付(70欧元)
}
//或者按照@Roland的建议:
结果?.destructured?.let{(类型、价格、货币)->
println($type($price$currency)///预订-已支付(70欧元)
}
}
正则表达式允许您将字符串作为条目,并在其中查找模式。它们在所有语言中都很常用,你可以在各地找到更多关于它们的信息
编辑:针对更新的问题进行编辑。我选择将
“预订-付费”
视为一个字符串,但根据您的粒度需求,有无数种方法可以做到这一点;老实说,在这一点上,正则表达式可能有点矫枉过正 通过字符串操作不使用正则表达式,并假设这是一种模式:
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)
}
编辑:我使用
str.substringBeforeLast(“,”
)获取价格,如果,
可以用作数字小数部分的delimeter,而不需要通过字符串操纵正则表达式,并假设这是一种模式:
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)
}
编辑:我使用
str.substringBeforeLast(“,”
)来获取价格,如果,
可以用作数字小数部分的delimeter考虑一下,当你更新了你的问题以真正从字符串中删除一部分时,以下是从给定字符串中删除多个字符串的一些方法:
使用正则表达式:
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, "") }
不过:大多数时候,我宁愿选择另一种方式:提取你需要的信息,然后打印出来。否则,您可能会开始公开一开始不想公开的服务的答案。考虑一下,当您更新问题以真正从字符串中删除一部分时,以下是一些从给定字符串中删除多个字符串的方法: 使用正则表达式:
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, "") }
不过:大多数时候,我宁愿选择另一种方式:提取你需要的信息,然后打印出来。否则,您可能会开始公开最初不想公开的服务的答案。您也可以通过
destructured
,例如:reg.find(str)?.destructured?让{(price,currency)->“$price$currency”}?运行(::println)?:println(“无匹配”)
@Roland我每天都更爱Kotlin一点。@ohwelppp当然,我会尝试更新答案。仅供参考,这只是一个用正则表达式表示的问题,“这里会有一些文本,这就是它应该看起来的样子”。你也可以通过destructured
,例如:reg.find(str)?.destructured?让{(price,currency)->“$price$currency”}?运行(::println)?:println(“不匹配”)
@Roland我每天都更喜欢Kotlin一点。@ohwelppp当然,我会尝试更新答案。仅供参考,这只是一个用正则表达式表示的问题,“这里会有一些文本,这就是它应该看起来的样子”。从那里开始,它将为您获取该文本。然而,removeAll
(如果它存在的话)并不是最好的方法。。。如果可能的话,我更愿意使用正则表达式或以另一种方式解析它……但是removeAll
(如果它存在的话)并不是最好的方法。。。如果可能的话,我更愿意使用正则表达式或以另一种方式解析它。。。