VBA之正则表达式(11)

添加千分位(2/3)》博文讲解了实现添加千分位功能的正则表达式如下:

((\.\d+[\w\W]*?)*?\d)(?=(\d{3})+(\D|$))

如果调整一下测试段落的顺序:

珠穆朗玛峰高度8848.0
光速是300000000米/秒
马里亚纳海沟最大长度: 2550,平均深度: 8000,
最大宽度: 69,最大深度11034
大家背诵圆周率3.1415926535

此时最后一行的小数部分符合表达式的匹配规则,正则替换时将在535之前添加千分位。

需要处理的文字段落可能有各种情况,当然可以用代码去判断段落末尾是否为小数数字。这里提供另一种解决问题的思路,既然已经有了正则可以消耗掉小数部分数字,那么我们就在字符串末尾构造一个符合匹配规则的字符串。
能实现这个目的的字符串可能有很多,例如.8888,这样就成功的把最后一个匹配组扩展到了添加的后缀字符串中,正则替换完成后,去掉后缀字符串(注意替换后,需要去掉的字符串长度增加一位,因为多了一个千分位)就可以得到完美的结果。

VBA代码如下:

Sub RegExpDemo3()
    Dim strTxt As String, strPad As String
    Dim strRes As String
    Dim objRegEx As Object
    Set objRegEx = CreateObject("vbscript.regexp")
    objRegEx.Pattern = "((\.\d+[\w\W]+?)*?\d)(?=(\d{3})+(\D|$))"
    objRegEx.Global = True
    'objRegEx.MultiLine = True
    strPad = ".8888"
    strTxt = "珠穆朗玛峰高度8848.0" & vbNewLine & _
             "光速是300000000米/秒" & vbNewLine & _
             "马里亚纳海沟最大长度: 2550,平均深度: 8000," & vbNewLine & _
             "最大宽度: 69,最大深度11034" & vbNewLine & _
             "大家背诵圆周率3.1415926535"
    strRes = objRegEx.Replace(strTxt & strPad, "$1,")
    MsgBox strTxt & vbNewLine & vbNewLine & _
           Left(strRes, Len(strRes) - Len(strPad) - 1)
    Set objRegEx = Nothing
End Sub

结果如图所示。

后记,可能有的人会想到,VBA中也可以调用JS,听说JS的正则很强大,是否可以在VBA调用JS的正则呢?答案是肯定的,VBA调用JS正则没有问题,答案也是否定的,VBA的JS正则也不支持逆序环视,大家可以自己在VBA中测试一下。

(0)

相关推荐

  • [js] 第72天 写一个字符串重复的repeat函数

    今日试题: 写一个字符串重复的repeat函数 此开源项目四大宗旨:勤思考,多动手,善总结,能坚持 <论语>,曾子曰:"吾日三省吾身"(我每天多次反省自己). 前端面试 ...

  • VBA代码库11:强制用户启用宏(续)

    excelperfect 在<VBA代码库10:强制用户启用宏>中,讲解了一段用户在打开工作簿时必须启用宏才能使用工作簿功能的代码.本文给出另一段同样可以实现强制用户启用宏的代码. 如果用 ...

  • EXCEL VBA 使用正则表达式清洗替换数据

    在EXCEL表内遇到有规律性的数据需要提取或者替换时,比如在数据中提取时间,身份证号码等,EXCEL内自带的查找替换就难以实现,我们可以利用VBA适用正则表达式去对数据进行匹配. 什么是正则表达式? ...

  • vba中正则表达式

    vba中正则表达式

  • VBA之正则表达式(2)

    实例需求:数据保存在F列(公式,判断条件,whatever),需要在每个单元格引用之前添加A列指定的工作表名称+!,结果如H列所示,对于F16中的公式,由于I49已经指定工作表,所以此单元格不需要再处 ...

  •  VBA之正则表达式(3)

    实例需求:数据保存在B列,其格式为规格1*数量1 + 规格2*数量2 + ...,现在需要统计数量总和,如C列所示.例如B3中明细为100*3+115*1对应的包装个数就是3+1. 示例代码如下. S ...

  • VBA之正则表达式(5)

    实例需求:数据保存在A列中,需要将其中中文字符提取至B列.如何匹配中文字符呢? 大家都知道匹配英文单词很简单,[a-zA-z]把26个字母大小写将都涵盖了,可是中文字符怎么搞呢,是否也可以使用类似的方 ...

  •  VBA之正则表达式(6)

    实例需求:数据保存在A列中,需要对其中音标部分进行下划线标注,如C列所示,匹配这样的非典型字符,正则表达式是最佳选择. 示例代码如下. Sub RegExpDemo() Dim strTxt As S ...

  •  VBA之正则表达式(7)

    实例需求:数据保存在A列中,数据组之间使用全角逗号分隔,重整后需要将每组数据开始的圆括号部分移动到末尾,并合并相同的全角方括号内容.貌似这个需求有些拗口,实际效果见B列. 示例代码如下. Sub Re ...

  •  VBA之正则表达式(8)

    实例需求:数据保存在A列中,需要将其中重复字符分拆后保存在后续的列中,为简化示例代码,只考虑小写英文字符. 这个需求也并不复杂,用VBA代码逐个判断字符和其前后的字符对比,就可以区分每组,高手可以写出 ...