Сценарий 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 причинам:
- Он содержит двойную кавычку без экранирования. Двойные кавычки внутри строк VBScript необходимо экранировать, удваивая их, иначе интерпретатор интерпретирует ваше выражение как строку
"[,.*]["
с последующим (неверным) именем переменнойCN=]
(без оператора тоже) и начало следующей строки (третья двойная кавычка). Вы неправильно понимаете синтаксис регулярного выражения. Квадратные скобки указывают класс персонажа. Выражение
[,.*]
будет соответствовать любой отдельной запятой, точке или звездочке, а не запятой, за которой следует любое количество символов.То, что вы хотели использовать, было чередованием, которое выражается символом канала (
|
), а начало строки соответствует каретке (^
):regEx.Pattern = ",.*|^CN="
С учетом сказанного, в вашем случае лучшим подходом будет использование группы и замена всей строки только групповым соответствием:
regEx.Pattern = "^cn=(.*?),.*"
regEx.IgnoreCase = True
Result = regEx.Replace(strLine, "$1")