PowerShell 中的正则表达式,用于从 Active Directory 中的 Managedby 属性获取城市名



谁能帮我解决这个问题。我需要从活动目录中的"managedby"属性派生一个城市名称,如下所示:

CN=Marley, Bob,OU=Users,OU=PARIS,DC=Domain,DC=com

所以我需要把所有东西都拿出来,只剩下"PARIS"

我真的对正则表达式了解不够,但假设它将以某种方式涉及使用 -replace 。我尝试过在网络上遵循一些示例,但我只是迷路了。我可以使用以下命令删除所有特殊字符:

'CN=Marley, Bob,OU=Users,OU=PARIS,DC=Domain,DC=com' -replace '[W]', ''

但我不知道如何进一步清理它。

任何帮助将不胜感激

实际上你不需要正则表达式。如果可分辨名称的结构始终相同,则可以使用嵌套-split...喜欢这个:

(('CN=Marley, Bob,OU=Users,OU=PARIS,DC=Domain,DC=com' -split '=')[3] -split ',')[0]

或者这个:

(('CN=Marley, Bob,OU=Users,OU=PARIS,DC=Domain,DC=com' -split ',')[-3] -split '=')[1]

我推荐第二个版本,因为这样可以避免与可分辨名称的CN部分中的逗号混淆。 ;-)

如果你无论如何都喜欢用正则表达式来做这件事,你可以使用环顾来提取用户 OU 和域之间的内容,如下所示:

'CN=Marley, Bob,OU=Users,OU=PARIS,DC=Domain,DC=com' -match '(?<=Users,OU=).+(?=,DC=DOmain)'
$Matches[0]

下面是一个基于-replace的解决方案,它假定城市名称跟在输入字符串中的最后一个,OU=后面(尽管使正则表达式更具体并不难)。

它还支持带有转义,字符(,)的城市名称,例如PARIS, Texas

$str = 'CN=Marley, Bob,OU=Users,OU=PARIS, Texas,DC=Domain,DC=com' 
# -> 'PARIS, Texas'
$str -replace '.+,OU=(.+?),DC=.+', '$1' -replace '\,', ','
  • .+,OU=贪婪地匹配一个或多个(+)任意字符(.)直到输入字符串中的最后一个,OU=子字符串。

  • (.+?)通过捕获组(捕获子表达式,(...))非贪婪地(+?)匹配一个或多个后续字符。

  • ,DC=.+匹配子字符串,DC的下一个匹配项,后跟字符串中剩余的任何内容 (.+)。

  • 请注意,这意味着正则表达式匹配整个字符串,因此替换表达式的值$1是唯一返回的内容:

    • $1是指包含城市名称的第一个捕获组的值。
  • 第二个-replace操作取消转义,,即将其转换为,- 注意要替换的文字如何必须作为正则表达式中的\进行转义。

最新更新