Оптимальный способ работы с регулярным выражением - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь выделить только имя группы.

Выполнение этой команды:

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, но я не могу просто сделать это инвертированным и сделать "заменить все, что НЕ совпадает с моим регулярным выражением, ничем".

Как мне это сделать, в основном сводить на нет весь этот Regex?

PS: я знаю, что могу использовать Get-ADPrincipalGroupMembership, чтобы получить только имя, но я не использую эту команду, поскольку она невероятно медленная по сравнению сGet-ADUser.

1 Ответ

0 голосов
/ 20 декабря 2018

Попробуйте выполнить следующее: для извлечения имен групп используется оператор -replace:

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

Примечание. Предполагается, что имена групп не содержат с экранированием ,символы.(\,).

  • Массив имен групп создается неявно, просто назначая весь конвейер переменной $groupNames.(Если есть вероятность, что может быть возвращена только группа 1 , и вы хотите убедиться, что результатом является массив , заключите весь конвейер в @(...), подвыражение массиваоператор.

  • $_ -replace '^CN=(.+?),.*', '$1' извлекает имя группы из каждого ввода:

    • ^CN= соответствует буквальному CN= в начале (^)входной строки.
    • (.+?) не жадно (?) соответствует непустому ряду произвольных символов (.+) и использует группу захвата ((...)) для захвата этого прогона.
    • ,.* соответствует литералу ,, за которым следует (жадно сопоставляемый) потенциально пустой набор произвольных символов (.*), т. Е. Он соответствует оставшемуся вводу.
    • Посколькузахватывает совпадения группы без жадности, она захватывает все, вплоть до first , char, который считается именем группы.
    • В целом, регулярное выражение по замыслу совпадает со всем вводомстрока, так что, используя только $1 - что захватила 1-я группа захвата - как tзамещающий операнд, это просто имя группы, которое возвращается.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...