Сценарий VBS для отчета по группам AD - шаблон Regex, не работающий с несколькими совпадениями

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

Код "re.pattern" здесь работает:

If UserChoice = "" Then WScript.Quit  'Detect Cancel
re.Pattern = "[^(a-z)^(0,4,5,6,7,8,9)]"
re.Global = True    
re.IgnoreCase = True
if re.test( UserChoice ) then 
   Exit Do
 End if
 MsgBox "Please choose either 1, 2 or 3 ", 48, "Invalid Entry"

В то время как приведенный ниже код regex.pattern - нет. Я хочу использовать его для форматирования результатов команды DSQUERY, в которой собраны группы, но я не хочу, чтобы какая-либо информация была после ",", и при этом я не хочу, чтобы начальный CN= обычно собирался при выполнении следующего запроса dsquery. запускается:"dsquery.exe пользователь forestroot -samid "& strInput &" | dsget user -memberof")

Строка, которую я хочу отформатировать, будет выглядеть примерно так:

CN= APP_GROUP_123,OU= Глобальные группы,OU= Счета,DC= Corp,DC= Contoso,DC= BIZ

Это результат, который я хочу:

APP_GROUP_123

Set regEx = New RegExp
**regEx.Pattern = "[,.*]["CN=]"**
Result = regEx.Replace(StrLine, "")

Я могу заставить работать регулярное выражение только по отдельности, либо

   regEx.Pattern = ",."

или же

regEx.Pattern = "CN="

код вложен здесь:

Set InputFile = FSO.OpenTextFile("Temp.txt", 1)
Set InputFile = FSO.OpenTextFile("Temp.txt", 1)
set OutPutFile = FSO.OpenTextFile(StrInput & "-Results.txt", 8, True)

do While InputFile.AtEndOfStream = False
    StrLine = InputFile.ReadLine
      If inStr(strLine, TaskChoice) then    
     Set regEx = New RegExp
     regEx.Pattern = "[A-Za-z]{2}=(.+?),.*"
     Result = regEx.Replace(StrLine, "")
     OutputFile.write(Replace(Result,"""","")) & vbCrLf
      End if

2 ответа

Решение

Это должно помочь вам начать:

str = "CN=APP_GROUP_123,OU=Global Groups,OU=Accounts,DC=corp,DC=contoso,DC=biz"
Set re = New RegExp
re.pattern = "[A-Za-z]{2}=(.+?),.*"

if re.Test(str) then
    set matches = re.Execute(str)
    matched_str = "Matched: " & matches(0).SubMatches(0)
    Wscript.echo matched_str
else
    Wscript.echo "Not a match"
end if

Выход:Matched: APP_GROUP_123

Регулярное выражение вам нужно [A-Za-z]{2}=(.+?),.*

Если совпадение прошло успешно, оно фиксирует все в скобках. .+? означает, что он будет соответствовать любому символу без жадности до первой запятой. ? в .+? делает выражение не жадным. Если вы пропустите это, вы запишите все до последней запятой в ,DC=biz

Ваше регулярное выражение "[,.*]["CN=]" не работает по 2 причинам:

  1. Он содержит двойную кавычку без экранирования. Двойные кавычки внутри строк VBScript необходимо экранировать, удваивая их, иначе интерпретатор интерпретирует ваше выражение как строку "[,.*]["с последующим (неверным) именем переменной CN=] (без оператора тоже) и начало следующей строки (третья двойная кавычка).
  2. Вы неправильно понимаете синтаксис регулярного выражения. Квадратные скобки указывают класс персонажа. Выражение [,.*] будет соответствовать любой отдельной запятой, точке или звездочке, а не запятой, за которой следует любое количество символов.

    То, что вы хотели использовать, было чередованием, которое выражается символом канала (|), а начало строки соответствует каретке (^):

    regEx.Pattern = ",.*|^CN="
    

С учетом сказанного, в вашем случае лучшим подходом будет использование группы и замена всей строки только групповым соответствием:

regEx.Pattern = "^cn=(.*?),.*"
regEx.IgnoreCase = True

Result = regEx.Replace(strLine, "$1")
Другие вопросы по тегам