[英]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 組包含值(等號右側)
Regex::findAll()
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.