2012-03-21 80 views
2

我想创建一个正则表达式来验证文件名以进一步处理。正则表达式与不匹配

我想,以配合扩展.txt.csv文件或.log 但我想它们排除在外,如果它与_out.csvmylog.log

到此为止是我的开始:

Function CanProcessFile(strFileNameIn, strLogName, strOutName) 
     Dim objRegEx, colMatches, strPattern 
     Set objRegEx = CreateObject("VBScript.RegExp") 
     strPattern = "((.txt$)|(.csv$)|(.Log$))" 
     strPattern = "(?!(" & strLogName & "$))" & strPattern 
     'strPattern = "(?!(" & strOutName & "$))" & strPattern 
     objRegEx.Pattern = strPattern 
     objRegEx.IgnoreCase = True 
     Set colMatches = objRegEx.Execute(strFileNameIn) 
     If colMatches.Count > 0 Then 
     CanProcessFile = True 
     Else 
     CanProcessFile = False 
     End If 
    End Function 

但每我尝试添加一个^?!(_out.csv$)它失败。

+0

我开始怀疑我是否应该只创建两个表达式,如果它匹配第一个过滤器,则拒绝它是否与第二个表达式匹配。 – 2012-03-21 15:10:28

回答

2

我认为,创建两个过滤器(如您在上面评论建议)可能是最好的一段路要走,但如果你喜欢做在一个单一的正则表达式,那么你应该能够编写:

objRegEx.Pattern = "^(?!.*(_out\.csv|mylog\.log)$).*\.(txt|csv|log)$" 

这确保了文件不开始.*(_out\.csv|mylog\.log)$(即,它不_out.csvmylog.log)。

+0

这是按编码方式工作的,但它要求输出文件和日志文件必须是硬编码的。我试图通过在VBS的开头添加简单的初始用户声明来避免这种情况。除非有某种方法不要求“。”。被散列,除了另一个RegEx.Replace ....但是再一次,存在扩展少的“mylog_log”文件的可能性是什么。 – 2012-03-22 12:58:35

0

我不知道是否vbscript的支持负回顾后,但如果这样做,有一个尝试:

(?<!_out|mylog)\.(?:txt|csv|log)$ 

可能的VBScript接受负回顾后发而不是可变长度回顾后,在这种情况下,使用:

(?<!_out)(?<!mylog)\.(?:txt|csv|log)$ 
+0

正则表达式中的语法错误 – 2012-03-21 14:58:45

+0

@PaulYoung:可能是vbscript不接受可变长度lookbehind。看我的编辑。 – Toto 2012-03-21 15:07:03

+0

不会,都会在字符中产生“正则表达式中的语法错误”:3 – 2012-03-21 15:17:38