Я хочу удалить все ненужные части строки, оставив только имя. Я не получаю ожидаемого результата. Вместо просто «Аришенский, Михаил» получаю пустую строку. Что я делаю не так и как я могу изменить свой код для достижения желаемого результата?
$text = "CN=Aryshenskyi\, Mihail,OU=Users,OU=SMZ,DC=smzmi,DC=local"
$regex = "(CN=).+?(\\), .+?(,OU=.+)"
$result = $text -replace $regex, ""
Write-Host $result
Вы можете адаптировать регулярные выражения, найденные в этих ответах , с помощью -replace
, чтобы извлечь общее имя, а затем применить другую замену для обратной косой черты. См. https://regex101.com/r/Clg5xj/1 для получения подробной информации о регулярном выражении.
$text = "CN=Aryshenskyi\, Mihail,OU=Users,OU=SMZ,DC=smzmi,DC=local"
$text -replace '^CN=|(?<!\\),.+' -replace '\\'
Вы можете адаптировать регулярное выражение, которое у вас сейчас есть, чтобы оно работало с помощью одной замены, однако это работает только для отличительных имен, имеющих экранированную запятую в их общем имени. Это также не сработает для пользователей в контейнере, а не в подразделении. См. https://regex101.com/r/46Xa2V/1 для получения подробной информации о регулярном выражении.
$text = "CN=Aryshenskyi\, Mihail,OU=Users,OU=SMZ,DC=smzmi,DC=local"
$text -replace '^CN=(.+?)(?:\\)(, .+?),OU=.+', '$1$2'
Добавление еще одного параметра, который должен обрабатывать замену за один раз, включая удаление обратной косой черты, экранирующей запятую в общем имени. См. https://regex101.com/r/YuGge3/1 для получения подробной информации о регулярном выражении.
$dns = @(
'CN=Aryshenskyi\, Mihail,OU=Users,OU=SMZ,DC=smzmi,DC=local'
'CN=Aryshenskyi Mihail,OU=Users,OU=SMZ,DC=smzmi,DC=local'
)
$dns -replace '^CN=|\\(?=,)|(?<!\\),.+'
Вы захватываете CN=
и все, что после OU=
, включая его в группы захвата 1 и 2, вместо того, чтобы захватывать то, что вы хотите извлечь @user2978216. увидеть обновление, близкое к тому, что вы планировали
Шаблон соответствует всей строке. Возвращаем фамилию и имя, добавляем еще две группы захвата. Посетите regex101.com, чтобы проверить выражения. Строка выбора в PowerShell 7 выделяет совпадения.
'CN=Aryshenskyi\, Mihail,OU=Users,OU=SMZ,DC=smzmi,DC=local' -replace
'(CN=)(.+?)(\\), (.+?)(,OU=.+)', '$2, $4'
Aryshenskyi, Mihail
Вам действительно не нужны другие группы захвата:
'CN=Aryshenskyi\, Mihail,OU=Users,OU=SMZ,DC=smzmi,DC=local' -replace
'CN=(.+?)\\, (.+?),OU=.+', '$1, $2'
Aryshenskyi, Mihail
Или же используйте регулярный просмотр вперед или назад. Или вместо этого получите свойства Active Directory GiveName и Surname или DisplayName.
Но почему мое регулярное выражение не работает? Я проверил сайт regex101, он фиксирует "CN = "; "\"; ",OU=Пользователи,OU=SMZ,DC=smzmi,DC=local". Почему удаление части не работает?