如何优化正则表达式避免方括号内内容被多次匹配?
正则优化:匹配含列表的key:value项不拆分
我需要匹配字符串中以“, ”分隔的key:value数据,但遇到形如Mylist:[data1, data2, data3]的列表格式时,当前正则(?<=(: *)\[).*?(?=, )|(?<=, +(?=[^ \r\n]))(?:.*?(?=, )|[^\r\n\[\]]+?(?=\])|[^\r\n]+\](?= *\]))会将列表拆分为多个匹配项。希望优化正则,把包含[]的整个列表项作为单个匹配结果。
完整输入
MyString=[XXXXXX:XX XX XX XX, XXXXX:332.83, XXXXX:XXX-XX-XX XX:XX:XX, XXXX:0.0, XXXX:2, XXXX:0, XXXX:-256, XXXX:5, XXXX:136935, XXXX:0, XXXX:XX XXX XXX, XXXX:0.5, XXXXX:true, XXXX:0.509375, XXX:0.0, 2022-09-17,XXXXX:1, list1:[2000-00-00 00:00, 2022-11-16 15:29, 2022-11-16 15:29], list2:[2000-00-00 00:00, 2022-11-16 15:29, 2022-11-16 15:29], ]
期望匹配结果
match 1 = XXXXXX:XX XX XX XX match 2 = XXXXX:332.83 ... match x =2022-09-17,XXXXX:1 match y =list1:[2000-00-00 00:00, 2022-11-16 15:29, 2022-11-16 15:29] match z =list2:[2000-00-00 00:00, 2022-11-16 15:29, 2022-11-16 15:29]
优化后的正则表达式
(?<=, |\[)(?:[^\s,\[]+:\[(?:[^]]+)\]|[^,]+?)?(?=, |$|\])
正则说明
(?<=, |\[):正向预查,确保匹配项起始于,或[之后,定位正确的匹配起点[^\s,\[]+:\[(?:[^]]+)\]:匹配完整列表项,[^\s,\[]+匹配列表的key部分,\[(?:[^]]+)\]捕获从[到]的所有内容(包含内部逗号)|:分支匹配,兼容普通项场景[^,]+?:匹配不含逗号的普通项,非贪婪模式避免过度匹配(?=, |$|\]):正向预查,确保匹配项结束于,、字符串末尾或]之前,保证项的完整性
该正则会将每个完整的key:value项(包括列表格式)作为单个匹配结果,不会拆分列表内部内容。
内容的提问来源于stack exchange,提问作者Nitneuq
相关产品推荐
相关产品推荐

