前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA:正则表达式(8) -重复字符的分组

VBA:正则表达式(8) -重复字符的分组

作者头像
Exploring
发布2023-10-05 14:54:44
4010
发布2023-10-05 14:54:44
举报

需求:数据保存在A列,需要将其中的重复字符分拆后保存在后续的列中,这里只考虑小写英文字符。

下面介绍两种解决方案。

1 正则提取

示例代码如下:

代码语言:javascript
复制
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次(也就是只有单个字符)或者多次。

2 正则替换

示例代码如下:

代码语言:javascript
复制
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)通过组号引用分组

引用分组的目的是对重复出现的文本进行匹配,注意,不是重复出现的模式,而是重复出现的文本

正则表达式中,可以通过分组号来引用:

  • \n:使用分组的编号来引用分组,分组按照正则表达式中出现的顺序编号1、2、3、... 示例的正则表达式:\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+)

代码语言:javascript
复制
文本: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)

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-10-04 21:55,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 数据处理与编程实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 正则提取
  • 2 正则替换
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com