提问人:Kenny 提问时间:6/20/2014 最后编辑:Kenny 更新时间:6/21/2014 访问量:418
用于报告 AD 组的 VBS 脚本 - 正则表达式模式不适用于多个匹配项
VBS script to report AD groups - Regex pattern not working with multiple matches
问:
在获取正则表达式语句以接受两个表达式时遇到问题。
这里的“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
答:
这应该能让你开始:
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
评论
matches(0).Submatches(0)
regEx.Execute()
strLine
正则表达式不起作用有两个原因:"[,.*]["CN=]"
它包含一个未转义的双引号。VBScript 字符串中的双引号必须通过加倍来转义,否则解释器会将您的表达式解释为字符串,后跟一个(无效的)变量名(也没有运算符)和下一个字符串的开头(第 3 个双引号)。
"[,.*]["
CN=]
您误解了正则表达式语法。方括号表示字符类。表达式将匹配任何单个逗号、句点或星号,而不是逗号后跟任意数量的字符。
[,.*]
您打算使用的是交替,它由管道符号 () 表示,字符串的开头由插入符号 () 匹配:
|
^
regEx.Pattern = ",.*|^CN="
话虽如此,在您的案例中,更好的方法是使用组并用组匹配替换整个字符串:
regEx.Pattern = "^cn=(.*?),.*"
regEx.IgnoreCase = True
Result = regEx.Replace(strLine, "$1")
评论