用于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