VBA之正则表达式(36)-- 提取年份范围

57 篇文章 2 订阅
49 篇文章 18 订阅

实例需求:原始数据在A列,先需求整理为C列。

  • 所有年份补足4位数字
  • 原始数据中分割符不规范,有全角分号,半角分号和半角句号
  • 有的数据以分隔符结尾

在这里插入图片描述

示例代码如下。

Sub Demo()
    Dim objRegExp As Object, res()
    arr = [a1].CurrentRegion
    n = 1
    Set objRegExp = CreateObject("vbScript.Regexp")
    With objRegExp
        .Global = True
        .Pattern = ".*?(19|20)(\d\d)(-(\d\d\b))?|.+"
        For i = 2 To UBound(arr)
            s1 = .Replace(arr(i, 1), "$1$2 $1$4 ")
            s2 = .Replace(s1, "$1$2 ")
            yrs = Split(s2)
            For j = 0 To UBound(yrs)
                If Len(yrs(j)) > 0 Then
                    ReDim Preserve res(1 To n)
                    res(n) = yrs(j)
                    n = n + 1
                End If
            Next
        Next
    End With
    [d:d].Clear
    [d2].Resize(n - 1, 1) = Application.Transpose(res)
    Set objRegExp = Nothing
End Sub

【代码解析】
第3行代码将数据读取到数组中。
第5行代码创建正则表达式对象。
第7行代码设置全局匹配。
第8行代码设置匹配模式。
第9~20行代码循环处理数据。
第10~11行代码执行正则替换。
第12行代码将字符串拆分为年份。
第13~19行代码循环处理年份。
如果yrs数组元素不为空,在第16行代码将年份写入数组中。
第22行代码清空D列。
第23行代码将结果写入单元格中。
第24行代码释放对象变量占用的系统资源。

正则表达式说明
.*?非贪婪匹配任意字符
`(1920)`
\d\d匹配两位数字
(-(\d\d\b))?匹配减号开头的两位数字,并且以单词边界结束
.+匹配任意一个或者多个字符

示例代码运行结果如下图所示。

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值