用于date编码文档的VBA正则expression式模式

我开始从事一项新工作,事实certificate,在一堆目录中有大量完全没有组织,非标准化的文件名(手工操作太多)。 最初,我的计划是使用一个简单的VBA脚本来使用前13个字符的string比较,如果它们不匹配,则在前面放置一个理想date格式的string(利用文档创builddate)然后我注意到已经存在的几种模式,通过做我原来的计划,我将在未来创build另一个问题(通过在我的理想string后面有不正确的date代码)。 因此,经过研究,我意识到正则expression式模式应该走的路。

我的理想起始格式是这样的:“yyyy.mm.dd – ”(即“2014.11.20 – ”我试图创build我的第一个expression式来匹配这个,但迄今为止没有运气:

^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ 

有人可以告诉我哪里错了吗? 我通过在线教程进行的search让我感到比开始时更困惑。

从那里的计划是匹配目录中的其他常见的date格式(下面),并将其replace为“理想”,任何帮助将识别它们的正则expression式将不胜感激。

“yymmdd”“yyyy mm dd – ”“yyyymmdd”“yyyymmdd – ”

我的计划是使用一个简单的IF vba函数,find名称匹配的名称,并执行必要的VBAstring操作来创build正确的标准格式。

例如,如果文件的当前名称是“141003 xxxxxx”,它将被replace为“2014.10.03 – xxxxx”等。

非常感谢您的帮助。

在你的表情中,你已经把四个数字组分成了三个点。 显然,date只有两个点的三个数字组。 所以第一个date模式的正则expression式是:

 ^[0-9]{4}\.[0-9]{2}\.[0-9]{2} 

演示: https : //regex101.com/r/vUigcj/1

请注意{4}{2}量词分别需要四位和两位数字,而不是由+量词提供的更宽松的“一个或多个数字”条件。

覆盖您列出的所有模式的更通用的正则expression式

 ^(?:[0-9]{2})?[0-9]{2}[ .]?[0-9]{2}[ .]?[0-9]{2} (?:- )? 

演示: https : //regex101.com/r/vUigcj/2

说明:

  • ^ – string锚的开始
  • (?: – 非捕获组启动
    • [0-9]{2} – 年份的前两位数字
  • ) – 未捕获组的结束
  • ? – 使这个组是可选的(允许省略世纪数字)
  • [0-9]{2} – 一年的最后两位数字
  • [ .] – 空格或点date分隔符
  • ? – 使这个分隔符可选
  • [0-9]{2} – 月份的两位数字
  • [ .]? – 另一个可选的date分隔符
  • [0-9]{2} – 两位数的一天
  • – 空间(字面上)
  • (?:- )? – 可选的是一个破折号和空格

yyyy.mm.dd的模式,例如2014.11.20是:

 (^[0-9]{4})(.)([0-9]{2})(.)([0-9]{2}) 

注意RegEx训练和testing的好网站: RegEx101

这里是一个示例VBA函数,它可以处理您的所有需求:

 Dim regEx As New RegExp Function ReplaceDates(text As String, pattern As String, Optional centuryPrefix As String) Dim replacement As String Dim fullMatch As String With regEx .Global = False .MultiLine = True .IgnoreCase = False .pattern = pattern End With If regEx.test(text) Then Set matches = regEx.Execute(text) fullMatch = matches(0).Value replacement = Replace(text, fullMatch, centuryPrefix & matches(0).SubMatches(0) & "." & matches(0).SubMatches(1) & "." & matches(0).SubMatches(2) & " - ") ReplaceDates = replacement End If End Function Sub test() Dim pattern1 As String Dim pattern2 As String Dim pattern3 As String ' will match "140324 xxx" pattern1 = "^(\d{2})(\d{2})(\d{2})\s" ' will match "2014 03 24 - xxx" pattern2 = "^(\d{4})\s(\d{2})\s(\d{2})\s-\s" ' will match "20140324 xxx" pattern3 = "^(\d{4})(\d{2})(\d{2})\s" Debug.Print ReplaceDates("141024 xxxxxx ", pattern1, "20") Debug.Print ReplaceDates("2014 03 24 - xxxxxx ", pattern2) Debug.Print ReplaceDates("20140324 xxxxxx ", pattern3) End Sub