正则中已转义字符串的二次转义方法及DN转换脚本问题求助
正则中已转义字符串的二次转义方法及DN转换脚本问题求助
嘿,我来帮你捋捋这个问题~
首先,你的问题核心在于:当前正则([^\/]+)会把所有/字符都当成OU的分隔符,但你的CN里存在转义过的\/——这些/其实是CN名称的一部分,不是真正的分隔符,所以正则错误地拆分了这些转义后的/,导致生成了多余的OU项。
你的思路方向是对的,确实需要处理转义的/,但不是简单的二次转义,而是要让正则能区分被转义的\/和作为分隔符的原生/。
解决方案:使用正则断言区分转义与非转义的分隔符
我们可以用负向后行断言来匹配那些「前面没有反斜杠」的/,也就是真正的分隔符,这样就能跳过转义后的\/。同时,拆分后还要把转义的\/还原成真实的/,这样DN里的OU名称才是正确的。
修改后的代码示例:
# 假设$DNOUs是你的原始CN字符串,比如 "test.example.com/This\/is\/a\/escaped/\space/\OU/person" # 匹配未被反斜杠转义的/作为分隔符 $splitPattern = '(?<!\\)/' $OUItems = $DNOUs -split $splitPattern $OU = "" foreach ($item in $OUItems) { # 把转义的\/还原成真实的/ $cleanItem = $item -replace '\\/', '/' $OU += "OU=$cleanItem," } # 移除末尾多余的逗号 $OU = $OU.TrimEnd(',')
关键解释:
- 正则
(?<!\\)/:(?<!\\)是负向后行断言,确保当前匹配的/前面没有反斜杠,也就是只匹配作为分隔符的原生/,跳过转义后的\/。 - 还原转义字符:用
-replace '\\/', '/'把CN里的转义标记去掉,让OU名称恢复成原本的样子,这样生成的DN才符合规范。
如果还是有问题,可以先输出$OUItems看看拆分后的结果是否正确,再调整正则或者转义处理逻辑就行~
备注:内容来源于stack exchange,提问作者user66001
相关产品推荐
相关产品推荐

