将字符串转换为配对列表:Kotlin

7nbnzgx9  于 2023-01-21  发布在  Kotlin
关注(0)|答案(2)|浏览(208)

有没有更简单的方法将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")],依此类推。
还创建了一个数据类,并尝试使用jacksonObjectMapper将字符串Map到数据类,以下this链接:

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)
juzqafwq

juzqafwq1#

1.您可以创建一个正则表达式来匹配环境变量中的所有字符串。Regex::findAll()
1.然后在创建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)
6fe3ivhb

6fe3ivhb2#

使用正则表达式匹配括号从来都不是一个好主意。
我建议采取循序渐进的办法:
您可以首先通过以下方式匹配名称和值

(\w+)=(.*)

在这里,您可以获得第1组中的名称和第2组中的值,而无需考虑值中可能出现的任何后续=字符。
如果您想拆分该值,我将通过匹配by首先去掉开始和结束括号

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

(or只需将字符串的前两个字符和最后两个字符删除,如果始终给定字符串,则以[(开头,以)]结尾)
然后通过拆分得到单个列表条目

\),\(

(take注意拆分操作也需要一个正则表达式,因此必须对其进行转义)
对于每个列表条目,您可以简单地将其拆分为

,\s*

或者,如果要删除引号字符,请将 match

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

其中组1包含键(等号左侧),组2包含值(等号右侧)

相关问题