Удаление ненужных частей из строки - PullRequest
0 голосов
/ 29 октября 2018

Я использую клиента, которого я не могу изменить, и он отправляет мне данные, которые выглядят так:

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

, и я хотел бы извлечь из этого только 70 EUR

Какой лучший способ сделать такое в котлине? Я не нашел никаких removeAll("", "", ...) функций для String, только заменил, но пришлось бы связать их, чтобы удалить price.amount и price.currency.

EDIT:

Нужно получить БРОНИРОВАНИЕ - ОПЛАТА (70 EUR) на самом деле, забыл об этой части.

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Без регулярных выражений при обработке строк и при условии, что это шаблон:

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(","), чтобы получить цену, в случае, если , может использоваться в качестве разделителя для десятичной части в числе

0 голосов
/ 29 октября 2018

Подумав об этом, и когда вы обновили свой вопрос, чтобы действительно удалить только часть из строки, вот несколько подходов для удаления нескольких строк из данной строки:

Использование регулярного выражения:

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, "") }

Тем не менее: большую часть времени я предпочел бы пойти другим путем: извлечь необходимую вам информацию и просто распечатать ее, как и Баптист показал в своем ответе . В противном случае вы можете начать раскрывать ответы той службы, которую вы не хотели раскрывать.

0 голосов
/ 29 октября 2018

Это звучит как работа для регулярных выражений!

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" как одну строку, но существует бесконечное количество способов сделать это, в зависимости от ваших потребностей в детализации; и, честно говоря, в этот момент регулярное выражение может быть немного излишним. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...