如何在Dart中遍历非标准嵌套配置结构并提取顶层子区块?
嵌套配置区块提取实现方案
问题原因
你原先使用的正则\[[^\][]*]仅能匹配内部不包含方括号的括号对,所以会优先匹配到配置中最内层的数组结构(比如["foo" "bar" "baz"]),无法正确捕获包含嵌套括号的外层目标区块。
解决方案
Dart 正则引擎支持递归匹配语法,可以实现任意层级嵌套方括号的完整匹配,修改后的代码如下:
void main() { String str = '''[ [ a: 1 b: ["foo" "bar" "baz"] ] [ c: 2 d: "some value" e: ["mike" "piter"] ] [ f: 3 g: "some another value" ] ]'''; // 支持嵌套方括号匹配的正则 final nestedBracketRegex = RegExp(r'\[(?:[^][]|(?R))*\]'); Iterable<RegExpMatch> allMatches = nestedBracketRegex.allMatches(str); List<String> blocks = allMatches.map((match) => match.group(0)!).toList(); // 移除最长的最外层包裹块,剩余为目标区块 blocks.sort((a, b) => b.length.compareTo(a.length)); blocks.removeAt(0); // 逐个打印目标区块 for (var blk in blocks) { print(blk); print('\n'); } }
正则逻辑说明
\[匹配起始左方括号(?:[^][]|(?R))*为核心匹配规则:[^][]匹配所有非方括号的字符(包含换行符)(?R)代表递归复用整个正则表达式,用来匹配嵌套的方括号结构- 两种规则重复匹配,直到命中当前层级对应的右方括号
\]匹配当前层级的结束右方括号
运行上述代码即可按顺序输出你需要的三个配置区块。
内容的提问来源于stack exchange,提问作者Dmitry Bubnenkov
相关产品推荐
相关产品推荐

