簡體   English   中英

將字符串轉換為對列表:Kotlin

[英]Convert String into list of Pairs: Kotlin

是否有更簡單的方法將 Intellij IDEA 環境變量轉換為元組列表?

我的 Intellij 環境變量是

GROCERY_LIST=[("egg", "dairy"),("chicken", "meat"),("apple", "fruit")]

環境變量作為字符串訪問到 Kotlin 文件中。

val g_list = System.getenv("GROCERY_LIST")

理想情況下,我想遍歷g_list ,第一個元素是("egg", "dairy")等等。 然后("egg", "dairy")是一個元組/對

我試圖用不在引號內的逗號分隔g_list

val splitted_list = g_list.split(",(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*\$)".toRegex()).toTypedArray()

這給了我第一個元素[("egg",第二個元素是"dairy")]等等。

還創建了一個數據 class 並嘗試使用jacksonObjectMapper 以下鏈接將 map 字符串轉換為數據 class:

val mapper = jacksonObjectMapper()
val g_list = System.getenv("GROCERY_LIST")
val myList: List<Shopping> = mapper.readValue(g_list)

data class Shopping(val a: String, val b: String)

使用正則表達式來匹配括號從來都不是一個好主意。

我建議采用循序漸進的方法:

您可以先通過以下方式匹配名稱和值

(\w+)=(.*)

您在第 1 組中獲得名稱,在第 2 組中獲得值,而無需關心值中可能出現的任何后續=字符。

如果您隨后想要拆分該值,我將首先通過匹配來擺脫開始和結束括號

(?<=\[\().*(?=\)\])

(或者簡單地切斷字符串的第一個和最后兩個字符,如果它總是以[()]開頭)

然后從拆分中獲取單個列表條目

\),\(

(注意拆分操作也需要一個正則表達式,所以你必須轉義它)

對於每個列表條目,您可以簡單地將其拆分為

,\s*

或者,如果要刪除引號字符,請使用匹配

\"(.*)\",\s*\"(.*)\"

其中第 1 組包含鍵(等號左側),第 2 組包含值(等號右側)

  1. 您可以創建一個正則表達式來匹配環境變量中的所有字符串。 Regex::findAll()
  2. 然后在創建Shopping對象列表時循環遍歷字符串。
// Raw data set.
val groceryList: String = "[(\"egg\", \"dairy\"),(\"chicken\", \"meat\"),(\"apple\", \"fruit\")]"

// Build regular expression.
val regex = Regex("\"([\\s\\S]+?)\"")
val matchResult = regex.findAll(groceryList)
val iterator = matchResult.iterator()

// Create a List of `Shopping` objects.
var first: String = "";
var second: String = "";
val shoppingList = mutableListOf<Shopping>()
var i = 0;

while (iterator.hasNext()) {
    val value = iterator.next().value;

    if (i % 2 == 0) {
        first = value;
    } else {
        second = value;
        shoppingList.add(Shopping(first, second))
        first = ""
        second = ""
    }

    i++

}

// Print Shopping List.
for (s in shoppingList) {
    println(s)
}

// Output.
/*
    Shopping(a="egg", b="dairy")
    Shopping(a="chicken", b="meat")
    Shopping(a="apple", b="fruit")
*/

data class Shopping(val a: String, val b: String)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM