Соответствие строк с и без экранирующих символов с помощью RegEx - PullRequest
1 голос
/ 23 апреля 2019

У меня отличные имена от объектов Active Directory, и мне нужно отфильтровать управляющие символы при разбиении этих цифр на простые имена.

У меня уже есть строка -split PowerShell, но это не отфильтровывает escape-символы.Я пробовал регулярное выражение с положительным взглядом, но мне нужно в этом случае что-то вроде дополнительного положительного взгляда?Может быть, я просто думаю слишком сложно.

Примеры строк:

  1. OU=External,OU=T1,OU=\+TE,DC=test,DC=dir
  2. OU=\#External,OU=T1,OU=\+TE,DC=test,DC=dir
  3. OU=\+External,OU=T1,OU=\+TE,DC=test,DC=dir

Поскольку + и # экранированы, но являются фактическими именами этих объектов, мне нужно удалить экранирующие символы

С помощью следующей оболочки PowerShell можно получить имяобъект

($variable -split ',*..=')[1]

Фактический результат:

  1. External
  2. \#External
  3. \+External

Ожидаемый результат:

  1. External
  2. #External
  3. +External

Возможно использоватьрегулярное выражение с $variable -creplace "REGEX", но я не могу найти регулярное выражение, которое соответствует всем этим случаям.

Моя попытка была: (?<=OU=\\).+?(?=,OU=), но она совпадает, если \ есть

Мне нужно это имя для создания объекта в Active Directory.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Для извлечения первого имени подразделения из DN при одновременном удалении необязательной обратной косой черты вы можете использовать регулярное выражение, например:

OU=\\?(.*?), *..=.*$

Демонстрация:

$dn1 = 'OU=External,OU=T1,OU=\+TE,DC=test,DC=dir'
$dn2 = 'OU=\#External,OU=T1,OU=\+TE,DC=test,DC=dir'
$dn3 = 'OU=\+External,OU=T1,OU=\+TE,DC=test,DC=dir'

$dn1 -replace 'OU=\\?(.*?), *..=.*$', '$1'  # output: External
$dn2 -replace 'OU=\\?(.*?), *..=.*$', '$1'  # output: #External
$dn3 -replace 'OU=\\?(.*?), *..=.*$', '$1'  # output: +External
2 голосов
/ 23 апреля 2019

С минимальными изменениями вы можете просто добавить косую черту в качестве необязательного в текущем регулярном выражении. Вы уже делаете нечто подобное с ведущей запятой

"OU=\#External,OU=T1,OU=\+TE,DC=test,DC=dir" -split ',?..=\\?'

Вы могли бы пойти дальше, если бы просто шли к первому разделу, но это отвечает на ваш основной вопрос. Вероятно, есть и другие преимущества, но, вероятно, они того не стоят.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...