用于报告 AD 组的 VBS 脚本 - 正则表达式模式不适用于多个匹配项

VBS script to report AD groups - Regex pattern not working with multiple matches

提问人:Kenny 提问时间:6/20/2014 最后编辑:Kenny 更新时间:6/21/2014 访问量:418

问:

在获取正则表达式语句以接受两个表达式时遇到问题。

这里的“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 命令的结果,但我不想要“,”之后的任何信息,也不想要运行以下 dsquery 时通常收集的前导 CN=:“dsquery.exe user forestroot -samid ”& strInput &“ |dsget 用户 -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
正则表达式 VBScript DSQuery

评论

0赞 arco444 6/20/2014
你能用你正在执行正则表达式的字符串和你想要的结果来更新问题吗?
0赞 Kenny 6/20/2014
根据要求添加了信息。

答:

0赞 arco444 6/20/2014 #1

这应该能让你开始:

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}=(.+?),.*

如果匹配成功,它将捕获括号中的所有内容。 表示它将不贪婪地匹配任何字符,直到第一个逗号。in 使表达式不贪婪。如果省略它,则将捕获所有内容,直到最后一个逗号.+??.+?,DC=biz

评论

0赞 Kenny 6/20/2014
还行!感谢您这么快的回答,问题是,CN= 和组信息会发生变化,真的,我只想删除“,”和前导“CN=”信息之后的所有内容。如何实现这一目标?
0赞 Kenny 6/21/2014
好的,我应该将 str 设置为 StrLine 吗?我给出的那行只是一个示例,但读取的组是动态的,可以有几十个。我忘了在最后包含完整的代码,现在将添加到 OP 中。
0赞 arco444 6/21/2014
您无需进行替换。 将包含您想要的文本。只需将其放入变量中,然后将该变量写入文件即可。您需要在输入字符串上执行该方法,我认为这是 - 无论将包含“CN=...”matches(0).Submatches(0)regEx.Execute()strLine
0赞 Kenny 6/21/2014
工程!感谢!供我自己参考 - 因为我可能会在某个时候再次这样做 - 你能解释一下“[A-Za-z]{2}=(.+?)”是如何删除我不想要的东西的吗?它基本上是说:删除任何看起来像“XX=”的东西吗?
0赞 Ansgar Wiechers 6/21/2014 #2

正则表达式不起作用有两个原因:"[,.*]["CN=]"

  1. 它包含一个未转义的双引号。VBScript 字符串中的双引号必须通过加倍来转义,否则解释器会将您的表达式解释为字符串,后跟一个(无效的)变量名(也没有运算符)和下一个字符串的开头(第 3 个双引号)。"[,.*]["CN=]

  2. 您误解了正则表达式语法。方括号表示字符类。表达式将匹配任何单个逗号、句点或星号,而不是逗号后跟任意数量的字符。[,.*]

    您打算使用的是交替,它由管道符号 () 表示,字符串的开头由插入符号 () 匹配:|^

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

话虽如此,在您的案例中,更好的方法是使用组并用组匹配替换整个字符串:

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

Result = regEx.Replace(strLine, "$1")

评论

0赞 Kenny 6/21/2014
感谢!这个解决方案很优雅,但是当我将模式更改为“^cn=(.*?),.*”“CN=GROUPABC-123,OU=ABC,OU=Accounts,DC=dom1,DC=corp,DC=contonso,DC=net”时,我仍然注意到“results.txt”的以下输出”
0赞 Kenny 6/21/2014
我最终选择了 arco444 提出的解决方案。您提供的代码较少,并且接近我正在使用的代码,但最终没有工作。