谁能帮我解决这个问题。我需要从活动目录中的"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
操作取消转义,
,即将其转换为,
- 注意要替换的文字如何必须作为正则表达式中的
\
进行转义。