正则表达式 - 从区别名称中提取OU

3
我可以帮您进行翻译。需要从我的可分辨名称中使用正则表达式提取“OU”部分。
例如:
"CN=DAVID Jean Louis (a),OU=Coiffeur,OU=France,DC=Paris,DC=France"

"CN=PROVOST Franck,OU=Coiffeur,OU=France,DC=Paris,DC=France"

"CN=SZHARCOFF Michel (AB),OU=Coiffeur_Inter,OU=France,DC=Paris,DC=France"

我需要拥有

"OU=Coiffeur,OU=France"  

"OU=Coiffeur,OU=France"

"OU=Coiffeur_Inter,OU=France"

我尝试使用以下代码 "CN=SZHARCOFF Michel (AB),OU=Coiffeur_Inter,OU=France,DC=Paris,DC=France" -match "^CN=[\w-()]*[\w]*" 进行匹配,但未成功。


你尝试使用正则表达式的代码是什么? - Wiktor Stribiżew
代码是:"CN=DAVID Jean Louis (a),OU=Coiffeur,OU=France,DC=Paris,DC=France" -matche "^CN=[\w-()]*[\w]*" - P0werSh3ell
所以,你尝试在字符串的开头匹配“CN=...”。我认为你使用了“-replace”。 - Wiktor Stribiżew
这只是因为它以CN开头。 我有类似这样的东西:"^CN=[\w-()]*\,(?<DN>OU=[\w,]+)," - P0werSh3ell
2个回答

4

您可以使用\bOU=[^,]+正则表达式匹配所有OU= + 1个或多个非逗号子字符串,然后使用,连接它们:

$matches = [regex]::matches($s, '\bOU=[^,]+') | % { $_.value }
$res = $matches -join ','

第一个字符串的输出:

OU=Coiffeur,OU=France

模式详情

  • \b - 一个单词边界,只匹配整个单词的OU
  • OU= - 一个字面的子字符串
  • [^,]+ - 1个或更多(+)非逗号字符(因为[^...]是一个否定字符类)。

参见正则表达式演示


谢谢!我明白了,但是能否用一个正则表达式连接两个OU? - P0werSh3ell
@P0werSh3ell 正则表达式不会连接文本,它只匹配与模式匹配的部分/完整字符串。无法在一个匹配操作中匹配不连续的文本。因此,您可以使用多个匹配然后连接,或者您也可以使用单个替换操作来获取它。替换方法通常比匹配和连接更繁琐。 - Wiktor Stribiżew

1

这个模式将支持包含逗号的DistinguishedName属性,并为匹配提供了命名组。我在PowerShell中使用它来解析ADObject的父级DN等。

^(?:(?<cn>CN=(?<name>.*?)),)?(?<parent>(?:(?<path>(?:CN|OU).*?),)?(?<domain>(?:DC=.*)+))$

查看Regexr演示:https://regexr.com/5bt64


太棒了正则表达式!谢谢! - MadBoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接