如何通过Ruby正则筛选AD DN条目并替换指定分隔符
问题结论
该需求完全可以通过Ruby正则搭配基础字符串处理实现,最终输出可完全匹配预期结果。
实现思路
- 首先解决DN条目拆分问题:AD的DN内部本身就用逗号做字段分隔符,不能直接按逗号切分,要以
CN=作为条目起始边界做匹配拆分,避免误拆DN内部字段。 - 其次做条目过滤:保留包含
ou=App1、不包含ou=App2的条目。 - 最后做字符替换:将匹配到的条目末尾
dc=internal后方的逗号替换为;即可。
可直接运行的Ruby代码
raw_dn_str = <<~CONTENT CN=Admins,ou=App1,ou=groups,dc=pkldap,dc=internal, CN=Auditors,ou=App1,ou=groups,dc=pkldap,dc=internal, CN=Operators,ou=App2,ou=groups,dc=pkldap,dc=internal CONTENT processed_result = raw_dn_str.scan(/^CN=.*?(?=,?\nCN=|\z)/m).filter_map do |dn_entry| # 按规则过滤条目 next if !dn_entry.include?('ou=App1') || dn_entry.include?('ou=App2') # 替换dc=internal后的逗号为分号 dn_entry.sub(/(dc=internal),?\s*$/, '\1;') + "\n" end.join # 输出结果 puts processed_result
运行输出
运行代码后得到的结果和预期完全一致:
CN=Admins,ou=App1,ou=groups,dc=pkldap,dc=internal; CN=Auditors,ou=App1,ou=groups,dc=pkldap,dc=internal;
正则说明
- 拆分条目使用的正则
/^CN=.*?(?=,?\nCN=|\z)/m:开启多行匹配模式,从行首的CN=起始做非贪婪匹配,匹配到下一个条目前的边界(可选逗号+换行+CN=)或者字符串末尾停止,自动过滤掉条目之间多余的尾逗号,不会误拆DN内部的字段逗号。 - 替换使用的正则
/(dc=internal),?\s*$/:精准定位到每个条目末尾的dc=internal字段,捕获该字段本身,匹配它后面跟着的可选逗号和末尾空白,替换时保留dc=internal,后面拼接分号即可。 - 过滤逻辑直接用字符串包含判断实现,比把判断逻辑全写在正则里可读性更高,也能避免正则匹配顺序导致的漏判、误判问题,后续调整过滤规则也更方便。
内容的提问来源于stack exchange,提问作者Andrew DeHuff
相关产品推荐
相关产品推荐

