需求:数据保存在A列,需要将其中的重复字符分拆后保存在后续的列中,这里只考虑小写英文字符。
下面介绍两种解决方案。
示例代码如下:
Option Explicit
Option Base 1
Sub RegExpDemo()
'正则提取
Dim objRegEx As Object, objMatch As Object, objMH As Object
Dim c As Range, strTxt As String, col As Integer
Set objRegEx = CreateObject("vbscript.regexp")
objRegEx.Global = True
objRegEx.Pattern = "([a-z])\1*"
'1 清除旧的数据
Range("B:AA").ClearContents
'2 遍历单元格
For Each c In Range([A1], Cells(Rows.Count, "A").End(xlUp))
strTxt = c.Value2
Set objMatch = objRegEx.Execute(strTxt)
If objMatch.Count > 0 Then
col = 2
For Each objMH In objMatch
Cells(c.Row, col) = objMH.Value
col = col + 1
Next
End If
Next
Set objMH = Nothing
Set objMatch = Nothing
Set objRegEx = Nothing
MsgBox "Done!"
End Sub
(1)([a-z])\1*
,([a-z])
用于匹配单个小写英文字符,并提取为第一组,\1*
的含义是第一组字符重复0次(也就是只有单个字符)或者多次。
示例代码如下:
Option Explicit
Option Base 1
Sub RegExpRepDemo()
'正则替换
Dim objRegEx As Object
Dim c As Range, strTxt As String, tempStr As String, arrRes
Set objRegEx = CreateObject("vbscript.regexp")
objRegEx.Global = True
objRegEx.Pattern = "([a-z])(?!\1|$)"
'1 清除旧的数据
Range("B:AA").ClearContents
'2 遍历单元格
For Each c In Range([A1], Cells(Rows.Count, "A").End(xlUp))
strTxt = c.Value2
tempStr = objRegEx.Replace(strTxt, "$1 ")
arrRes = Split(tempStr)
Cells(c.Row, 2).Resize(1, UBound(arrRes) + 1).Value2 = arrRes
Next
Set objRegEx = Nothing
MsgBox "Done!"
End Sub
(1)([a-z])(?!\1|$)
,其中?!
为零宽度否定顺序环视,表示校验位置右侧的内容不匹配Expression规则。也就是说,需要匹配的位置右侧,或者下一字符与匹配组不符,或者不在字符串末尾。
关于环视的更详细介绍,参见文末的参考资料[5]。
延伸阅读:
(1)通过组号引用分组
引用分组的目的是对重复出现的文本进行匹配,注意,不是重复出现的模式,而是重复出现的文本。
正则表达式中,可以通过分组号来引用:
\b(\w+)\b\s+\1\b
文本:I am am a boy 匹配到的内容:am am在正则表达式中,\b 是一个特殊的元字符,表示单词边界。它匹配一个单词的开始或结束的位置,而不匹配任何实际的字符。关于\b的更详细的介绍,参见文末的参考资料[2]。
(2)replace中1、2的用法
1、2表达的是正则表达式中小括号(即分组)中的内容;1是第一个小括号(分组)中的匹配结果,2是第二个小括号(分组)中的匹配结果,以此类推。通常1、2用在替换操作中。
示例的正则表达式:(\d+)-(\d+)-(\d+)
文本:123-456-789
替换文本:$3-$1-$2
结果:789-123-456
参考资料:
[1] VBA之正则表达式(8)-- 重复字符分组(https://blog.csdn.net/taller_2000/article/details/89735304)
[2] 正则表达式 - 元字符 \b 与 \B(https://www.runoob.com/regexp/regexp-metachar-b.html)
[3] 正则表达式 第三篇:分组和捕获 (https://www.cnblogs.com/ljhdo/p/10678281.html)
[4] 正则替换replace中$1的用法以及常用正则(https://www.cnblogs.com/leaf930814/p/7825288.html)
[5] 正则表达式:断言(环视)
[6] 正则表达式中的1、2在替换操作中的使用(https://blog.csdn.net/cnds123321/article/details/121196677)