使用正则表达式的最佳方式

时间:2018-12-20 18:51:35

标签: regex powershell active-directory

我正在尝试仅隔离组名。

执行以下命令:

Get-ADUser aaa00 -Properties memberof |
    Select-Object -ExpandProperty memberof 

返回:

CN=GroupName,OU=xxx,OU=xxx,DC=xxx,DC=xxx,DC=xxx

我只想要CN=之后的名称,即组名。

所以我在做:

Get-ADUser aaa00 -Properties memberof |
    Select-Object -ExpandProperty memberof |
    ForEach-Object { 
        $isolateName = $_ -match "(?<=\=)(.*?)(?=\,)"
        $matches[0]
    }

有效并且仅返回组名。

但是,我想将组名存储在数组中以备后用,所以我在做:

Get-ADUser aaa00 -Properties memberof |
    Select-Object -ExpandProperty memberof |
    ForEach-Object { 
        $isolateName = $_ -match "(?<=\=)(.*?)(?=\,)"
        [array]$Names += $matches[0]
    }

这很好。

我的问题是,使用RegEx的最佳方法是吗?

我先做-match,然后再检查$matches,但我不能只做倒转,而是做“用正则表达式匹配的内容全部替换掉​​”。

我该怎么做,基本上否定了整个正则表达式?

P.S .:我知道我可以使用Get-ADPrincipalGroupMembership仅获取名称,但是我不使用该命令,因为与Get-ADUser相比,它的运行速度非常慢。

1 个答案:

答案 0 :(得分:3)

尝试以下操作,该操作使用-replace运算符提取组名:

$groupNames = Get-AdUser gar25 -properties memberof | 
  Select-Object -ExpandProperty memberof |
    ForEach-Object { $_ -replace '^CN=(.+?),.*', '$1' }

注意:假设组名不包含转义的 ,字符。 (\,

  • 仅通过将整个管道分配给变量$groupNames即可隐式创建组名数组。 (如果有可能仅返回 1 组,并且您要确保结果为 array ,请将整个管道括在@(...)中,数组子表达式运算符。

  • $_ -replace '^CN=(.+?),.*', '$1'从每个输入中提取组名:

    • ^CN=在输入字符串的开头(CN=)与文字^匹配。
    • (.+?)非贪婪(?)匹配任意字符(.+)的非空游程,并使用捕获组((...))捕获该游程。
    • ,.*与文字,匹配,后跟(贪婪匹配)可能为空的任意字符(.*),即,它与其余输入匹配。
    • 由于捕获组非贪婪地匹配,因此它将捕获直到 first ,字符(假定为组名)之前的所有内容。
    • 总体而言,正则表达式在设计上与整个输入字符串匹配,因此仅使用$1-第一个捕获组捕获的内容-作为替换操作数,它只是返回的组名。