MySQL ini配置文件中[ndb_mgmd]块的正则提取方案问询
MySQL INI配置特定段提取问题解答
疑问1:能否通过正则直接提取所有[ndb_mgmd]块内的hostname与NodeId值
- 完全可以实现,只要匹配逻辑严格锚定参数行所属的段范围,就能完全避免误匹配其他配置块的同名字段。
- 适配支持多行、变长回溯的正则引擎(如PCRE、Java.util.regex、新版JS)的直接提取正则:
(?<=\[ndb_mgmd\][\s\S]*?)^\s*(hostname|NodeId)\s*=\s*([^\r\n#;]+) - 匹配逻辑说明:
- 通过正向回溯锁死参数行的前置段头必须为
[ndb_mgmd],从根源上过滤其他段的同名字段 - 忽略参数行前后的多余空格,自动截取等号右侧的参数值,同时排除行内注释内容(
#/;开头的注释) - 对示例配置执行匹配后,会直接得到4个有效结果:
2.2.2.2(hostname)、1(NodeId)、2.2.2.2(hostname)、4(NodeId),完全过滤其他段的冗余配置
- 通过正向回溯锁死参数行的前置段头必须为
- 引擎兼容说明:如果使用不支持变长回溯的正则引擎(如Python原生
re模块、旧版本JS),可替换为带前置段名捕获组的模式,匹配后仅保留段名捕获组为ndb_mgmd的结果行即可:\[ndb_mgmd\][\s\S]*?^\s*hostname\s*=\s*([^\r\n#;]+)|^\s*NodeId\s*=\s*([^\r\n#;]+)
疑问2:如何提取所有[ndb_mgmd]块的完整内容(优先不包含段头标识)
- 可通过锚定段头、下一个段头位置/文件结尾的方式提取块内容,自动排除
[ndb_mgmd]段头本身,全正则引擎可通用:\[ndb_mgmd\]\s*([\s\S]*?)(?=\s*\n\s*\[|\s*$) - 匹配结果说明:
- 段头
[ndb_mgmd]本身不会被纳入捕获结果,仅提取段头到下一个任意段头、文件末尾之间的所有内容 - 对示例配置执行匹配后,会得到两个独立的块捕获结果:
- 第一个块内容:
hostname=2.2.2.2\nNodeId=1 - 第二个块内容:
hostname=2.2.2.2\nNodeId=4\n\nrandomconfig
- 第一个块内容:
- 注:按照标准INI解析规则,段头后、下一个段头前的所有零散文本(包括示例末尾的
randomconfig行)都属于当前段的有效内容,如果需要过滤块内的无效非参数行,匹配后筛选包含=的有效配置行即可。
- 段头
内容的提问来源于stack exchange,提问作者Talal Najam
相关产品推荐
相关产品推荐

