【问题标题】:REGEX - Extract OU from Distinguished Name正则表达式 - 从专有名称中提取 OU
【发布时间】:2019-01-16 14:47:47
【问题描述】:

我需要使用 REGEX 从我的专有名称中提取“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]*" 但没有成功

【问题讨论】:

  • 你尝试正则表达式的代码是什么?
  • 代码是:"CN=DAVID Jean Louis (a),OU=Coiffeur,OU=France,DC=Paris,DC=France" -matche "^CN=[\w-()]*[\w]*"
  • 所以,您尝试在字符串的开头匹配CN=...。我以为你用的是-replace
  • 只是因为它是以CN开头的。我有这样的事情:"^CN=[\w-()]*\,(?<DN>OU=[\w,]+),"

标签: regex windows powershell extract distinguishedname


【解决方案1】:

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

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

第一个字符串的输出:

OU=Coiffeur,OU=France

模式详情

  • \b - 一个词边界,只匹配 OU 作为一个完整的词
  • OU= - 文字子字符串
  • [^,]+ - 1 个或多个 (+) 字符,而不是逗号(因为 [^...]negated character class)。

请参阅regex demo

【讨论】:

  • 谢谢!我了解,但是否可以使用 1 个正则表达式加入 2 个 OU?
  • @P0werSh3ell 正则表达式不加入文本,它只匹配匹配模式的部分/完整字符串。不可能在一次匹配操作中匹配不连续的文本。因此,您可以使用多个匹配然后加入,或者您也可以使用单个替换操作来获取它。替换的方法通常比匹配和连接更麻烦。
【解决方案2】:

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

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

查看正则表达式演示:https://regexr.com/5bt64

【讨论】:

  • 伟大的正则表达式!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 2012-02-02
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2015-07-08
相关资源
最近更新 更多