用于报告AD组的VBS脚本 - 正则表达式模式不能与多个匹配项一起使用

时间:2014-06-20 14:15:28

标签: regex vbscript dsquery

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

此处的“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用户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 个答案:

答案 0 :(得分:0)

这应该让你开始:

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

捕获所有内容直到最后一个逗号

答案 1 :(得分:0)

您的正则表达式"[,.*]["CN=]"有两个原因无效:

  1. 它包含未转义的双引号。 VBScript字符串中的双引号必须通过加倍来转义,否则解释器会将您的表达式解释为字符串"[,.*][",然后是(无效的)变量名CN=](也没有运算符)和开头下一个字符串(3 rd 双引号)。
  2. 您误解了regular expression语法。方括号表示字符类。表达式[,.*]将匹配任何单个逗号,句点或星号,逗号后跟任意数量的字符。

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

    regEx.Pattern = ",.*|^CN="
    
  3. 话虽如此,在你的情况下,一个更好的方法是使用一个组并用组匹配替换整个字符串:

    regEx.Pattern = "^cn=(.*?),.*"
    regEx.IgnoreCase = True
    
    Result = regEx.Replace(strLine, "$1")