实例需求:原始数据在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行代码释放对象变量占用的系统资源。
正则表达式 | 说明 |
---|---|
.*? | 非贪婪匹配任意字符 |
`(19 | 20)` |
\d\d | 匹配两位数字 |
(-(\d\d\b))? | 匹配减号开头的两位数字,并且以单词边界结束 |
.+ | 匹配任意一个或者多个字符 |
示例代码运行结果如下图所示。