如何用正则表达式忽略方括号内匹配,拆分带列表值的字段串?
拆分含嵌套列表的字段字符串解决方案
针对你遇到的问题——需要拆分包含嵌套列表(内部含逗号)的字段字符串,仅识别字段间的分隔逗号,可通过带断言的正则表达式实现,以下是具体方案:
正则表达式
(?<=(?:^|]))\s*,\s*(?=\w+:)
Kotlin 代码示例
fun main() { val input = "field1:1234,field2:[[1, 3],[3,4]], field3:[[1, 3],[3,4]]" // 编译正则,匹配字段间的分隔逗号 val fieldSeparator = Regex("(?<=(?:^|]]))\\s*,\\s*(?=\\w+:)", RegexOption.DOT_MATCHES_ALL) // 拆分字符串 val fields = input.split(fieldSeparator) // 输出结果验证 fields.forEach { println("字段内容:$it") } }
运行后输出:
字段内容:field1:1234 字段内容:field2:[[1, 3],[3,4]] 字段内容:field3:[[1, 3],[3,4]]
正则逻辑解释
(?<=(?:^|])):正向零宽后行断言,确保匹配的逗号要么在字符串开头,要么紧跟在列表结束标记]]之后——这就排除了列表内部的逗号。\s*,\s*:匹配逗号本身,同时兼容逗号前后的任意空白字符(处理示例中field2后逗号带空格的情况)。(?=\w+:):正向零宽先行断言,确保逗号后面紧跟字段名(字母/数字/下划线组成)加冒号,精准定位字段间的分隔符。
自定义调整说明
如果你的字段名格式不是\w+(比如包含特殊字符),只需修改(?=\w+:)部分即可。例如字段名是field加数字的格式,可改为(?=field\d+:)。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

