首页 > 解决方案 > 识别模式并提取子字符串

问题描述

我在 Excel 中有数千行,其中随机文本中有诸如“31.12.2019-30.12.2020”之类的句点。
我需要从每一行中提取这个子字符串并将其放在一个单独的单元格中。
子字符串始终具有相同的模式,但文本不同,它可以位于文本中的任何位置。

是否可以使用公式或通过 VBA 识别此模式:“XX.XX.20XX-XX.XX.20XX”,然后返回子字符串?

我无法通过谷歌找到公式。

在此处输入图像描述

标签: excelvbadateexcel-formulapattern-matching

解决方案


1) - Excel 公式

如果您使用 Excel 公式路线,请使用 in B2

=MID(A2,SEARCH("??.??.20??-??.??.20??",A2),21)

拖累...

SEARCH函数确实支持通配符,例如?(代表任何字符),因此返回感兴趣的子字符串的起始位置。在使用时,MID我们实际上可以提取此子字符串。


2) - VBA

根据我上面的评论,这也可以通过正则表达式巧妙地完成(请参阅@Warcupine 提供的链接)。正则表达式使您的模式更精确(例如,我们可以搜索数字而不是任何字符)。

我可以想象您会使用 UDF,您可以在其中链接到文本和有效模式,例如:

Public Function RegExtract(Txt As String, Pattern As String) As String

With CreateObject("vbscript.regexp")
    '.Global = True
    .Pattern = Pattern
    If .test(Txt) Then
        RegExtract = .Execute(Txt)(0)
    Else
        RegExtract = "No match found"
    End If
End With

End Function

B2你可以通过调用这个=RegExtract(A2,"\d\d\.\d\d\.20\d\d-\d\d\.\d\d\.20\d\d")

如您所见,该模式非常简单:

正则表达式可视化


结果:

在此处输入图像描述


推荐阅读