Regex 使用字符串修剪Powershell中的字符串。替换

Regex 使用字符串修剪Powershell中的字符串。替换,regex,powershell,Regex,Powershell,我正试图将Active Directory的“DifferentizedName”属性剥离为最具体的OU标题。例如,我得到: CN=Smith\, Tom,OU=Developers,OU=Users,DC=myOrganization,DC=com 我想把它简化为: Developers 我尝试过这样做,但没有成功(假设变量如上所述存储DistinguisedName): 这些语句不会对字符串进行任何更改 我不熟悉在Powershell中使用正则表达式,因此我假设我只是犯了一个语法错误,但

我正试图将Active Directory的“DifferentizedName”属性剥离为最具体的OU标题。例如,我得到:

CN=Smith\, Tom,OU=Developers,OU=Users,DC=myOrganization,DC=com
我想把它简化为:

Developers
我尝试过这样做,但没有成功(假设变量如上所述存储DistinguisedName):

这些语句不会对字符串进行任何更改

我不熟悉在Powershell中使用正则表达式,因此我假设我只是犯了一个语法错误,但概念是正确的。

您可以使用正则表达式:

$attribute = "CN=Smith\, Tom,OU=Developers,OU=Users,DC=myOrganization,DC=com"    
[regex]::Match($attribute, 'OU=(\w+),').Groups[1].Value
输出:

开发者

您可以使用它并替换为
空字符串
。请参阅演示


正如其他人已经建议的那样,使用正则表达式进行此类数据提取更简单,因为
String.Replace
不支持非贪婪匹配之类的东西。不过,我建议使用稍微复杂一点的正则表达式:

^.*?,\s*ou=(.*?)\s*(?:ou | dc)*$
因为当OU名称包含空格或逗号等字符时,您目前得到的建议将产生不希望的结果

演示:

PS C:\>$dn='CN=Smith\,Tom,OU=Developers\,Foo,OU=Users,DC=example,DC=com'
PS C:\>$dn-替换“^.*”,\s*ou=(.*?)\s*(?:ou|dc)。*$”,“$1”
开发者\,Foo
PS C:\>$dn-替换“^CN.*OU=|,.*$”
开发者\
PS C:\>[regex]::匹配($dn,'OU=(\w+))。组[1]。值

用户
谢谢!你能解释一下
(\w+)
组[1]
在做什么吗?从regex101.com复制的解释:/OU=(\w+),/OU=匹配字符OU=字面上(区分大小写)第一个捕获组(\w+)\w+匹配任何单词字符[a-zA-Z0-9]量词:+在一次和无限次之间,尽可能多次,根据需要返回[贪婪],匹配字符,literallyGroups[1]从[regex]::Match()中选择第二个组(包含捕获组)
$attribute = "CN=Smith\, Tom,OU=Developers,OU=Users,DC=myOrganization,DC=com"    
[regex]::Match($attribute, 'OU=(\w+),').Groups[1].Value
^CN.*?OU=|,.*$