UDF正则表达式 - 仅限yyyy

时间:2016-09-21 13:31:55

标签: regex vba

我正在学习一些正则表达式,我需要帮助吐出由我的正则表达式代码生成的匹配。我在这里发现了一些非常有用的资源来输出任何不匹配的东西,但我想只输出匹配的单元格部分。我正在寻找单元格中的日期,可能是单个yyyy日期或yyyy-yy等(如下面的示例数据所示)。

示例数据:

1951/52
1909-13
2005-2014
7 . (1989)-
1 (1933/34)-2 (1935/36)
1979-2012/2013

当前功能代码:(从此处的现有帖子中找到的代码段,但返回替换值而不是匹配的内容)

Function simpleCellRegex(Myrange As Range) As String
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim strReplace As String
    Dim strOutput As String

    strPattern = "([12][0-9]{3}[/][0-9]{2,4})|([12][0-9]{3}[-][0-9]{2,4})|([12][0-9]{3})"

1 个答案:

答案 0 :(得分:1)

您可以使用

\b[12][0-9]{3}(?:[,/-][0-9]{2,4})*\b

请参阅regex demo

注意如果您对整个单词搜索不感兴趣,可能会删除\b

模式详细信息

  • \b - 前导词边界(前面的char必须是非单词char或字符串的开头)
  • [12][0-9]{3} - 12后跟任意3位数字
  • (?:[,/-][0-9]{2,4})* - 零个或多个序列((?:...)*):
    • [,/-] - ,/-字符
    • [0-9]{2,4} - 任意2到4位
  • \b - 尾随单词边界(必须有非单词char或后面的字符串结尾)。

使用RegExp#Execute获取所有这些值的示例VBA代码:

Sub FetchDateLikeStrs()
Dim cellContents As String
Dim reg As regexp
Dim mc As MatchCollection
Dim m As match

Set reg = New regexp
reg.pattern = "\b[12][0-9]{3}(?:[,/-][0-9]{2,4})*\b"
reg.Global = True

cellContents = "1951/52 1909-13  2005-2014  7 . (1989)-  1 (1933/34)-2 (1935/36) 1979-2012/2013  1951,52"
Set mc = reg.Execute(cellContents)
For Each m In mc
 Debug.Print m.Value
Next

End Sub

enter image description here