You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:54:37