检查字符串中是否有日期并提取字符串的一部分

时间:2019-05-13 17:33:12

标签: regex excel vba date regex-lookarounds

我有成千上万行文本需要处理,而我感兴趣的行如下所示:

01/04/2019 09:35:41 - Test user (Additional Comments)

我目前正在使用此代码过滤掉所有其他行:

If InStr(FullCell(i), " - ") <> 0 And InStr(FullCell(i), ":") <> 0 And InStr(FullCell(i), "(") <> 0 Then

FullCell是我正在处理的数组。

我知道这不是最好的方法。有没有办法检查字符串开头是否有日期,格式为dd / mm / yyyy,然后提取“-”和“(”符号之间的用户名。

我玩过正则表达式,以查看是否有帮助,但是我的技能有限,无法在同一代码中同时实现VBA和正则表达式。

什么是最好的方法?

4 个答案:

答案 0 :(得分:3)

假设Fullcell(i)包含字符串,

If Left(Fullcell(i), 10) Like "##/##/####"

如果您有日期,则会返回True(请注意,日期不会区分dd/mm/yyyymm/dd/yyyy

还有

Mid(Fullcell(i), InStr(Fullcell(i), " - ") + 2, InStr(Fullcell(i), " (") - InStr(Fullcell(i), " - ") - 2)

将返回用户名

答案 1 :(得分:1)

我敢肯定有一种更有效的方法来执行此操作,但是我已经使用以下解决方案很多次了:

这将选择日期:

x = 1
Do While Mid(FullCell,1,x) <> " "
    x = x + 1
Loop
strDate = Left(FullCell,x)

这将找到连字符的字符号,用户名以2个字符开头。

x = 1
Do While Mid(FullCell,x,1) <> "-"
    x = x + 1
Loop

然后我们将找到用户名的结尾

y = x + 2
Do While Mid(FullCell,y,1) <> " "
    y = y + 1
Loop

用户名现在应该是字符(x + 2到y-1)

strUsername = Mid(FullCell, x + 2, y - (x + 2) - 1)

答案 2 :(得分:1)

抽象是您的朋友,只要有可能,将它们分解为自己的私有函数总是有帮助的。您可以将代码放入函数中,然后调用类似ExtractUsername的代码。

下面,我举了一个例子,我决定使用RegExp方法(后期绑定),但是您也可以像上面的示例一样使用字符串函数。

如果找到上面提到的模式,此函数将返回用户名,否则,将返回一个空字符串。

Private Function ExtractUsername(ByVal SourceString As String) As String

    Dim RegEx As Object
    Set RegEx = CreateObject("vbscript.regexp")

    '(FIRST GROUP FINDS THE DATE FORMATTED AS DD/MM/YYY, AS WELL AS THE FORWARD SLASH)
    '(SECOND GROUP FINDS THE USERNAME) THIS WILL BE SUBMATCH 1
    With RegEx
        .Pattern = "(^\d{2}\/\d{2}\/\d{4}.*-)(.+)(\()"
        .Global = True
    End With

    Dim Match As Object
    Set Match = RegEx.Execute(SourceString)

    'ONLY RETURN IF A MATCH WAS FOUND
    If Match.Count > 0 Then
        ExtractUsername = Trim(Match(0).SubMatches(1))
    End If

    Set RegEx = Nothing

End Function

正则表达式模式分为三部分,日期(和斜杠),用户名和左括号。您感兴趣的是用户名,该用户名在SubMatch中将为数字1。

Regexr是一个练习正则表达式的有用站点,可以向您展示我使用的模式正在做的事情。

请注意,使用正则表达式可能会给您带来性能问题,您应该针对正则字符串函数对其进行测试,以查看哪种方法最适合您的情况。

答案 3 :(得分:1)

这就是我要怎么做

昏暗变量

Dim ring as Range
Dim dat as variant
Dim FullCell() as string
Dim User as string
Dim I as long

设置范围

Set rng = ` any way you choose
Dat = rng.value2

Loop dat

For i = 1 to UBound(dat, 1)

拆分数据

    FullCell = Trim(Split(FullCell, "-"))

测试是否裂开

    If UBound(FullCell) > 0 Then

测试是否匹配

    If IsDate(FullCell(0)) Then
        i  = Instr(FullCell(1), "(")-1)
        If i  then
            User = left$(FullCell(1), i)
            '  Found a user 

        End If
    End If

    End If

Next