VBA之正则表达式(10)

添加千分位(1/3)》博文讲到,简单合并正则表达式无法实现想要的效果,问题在于小数部分数字。
这里的核心是如何消耗掉小数部分的数字,不被捕获,可以实现添加千分位功能的正则表达式如下:

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

测试段落为

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

捕获组 正则表达式
$1 ((\.\d+[\w\W]*?)*?\d)
$2 (\.\d+[\w\W]*?)
$3 (\d{3})
$4 (\D|$)

捕获组3和4组合而成的断言(?=(\d{3})+(\D|$)和上一篇博文中的用法一致,其中\D代表非数字字符。

表达式中[\w\W]看着有些奇怪,\w代表字母和数字,\W代表非字母和非数字,加在一起不就是全部吗,但是需要注意这个组合比常用的\.多一个新行标识。

分析一下捕获组2。

正则表达式 含义
\.\d+ 小数点加至少一位数字开头
[\w\W]*? 懒惰匹配任意数量任意字符

分析一下捕获组1。

正则表达式 含义
($2)*? 匹配任意数量匹配组2,即可以有或者没有小数点
\d 匹配一位数字

接下来看一下实际匹配的结果。第一个成功匹配的结果为黄色部分,也就是

$1 =  .1415926535[换行]珠穆朗玛峰高度8

其后为848.,可以匹配断言(?=(\d{3})+(\D|$)
第二个成功匹配的结果为蓝色部分,也就是

$1 = .0[换行]光速是300

其后为000,也可以匹配断言(?=(\d{3})+(\D|$)
依次类推,这样就定位到了需要添加千分位的字符的位置,即每一个匹配组1之后的位置,使用正则替换就可以简单的实现添加千分位的目的。这个正则的核心是如何消耗掉小数点及其之后的数字。

正则表达式有了,附上VBA代码。

Sub RegExpDemo2()
    Dim strTxt 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
    strTxt = "大家背诵圆周率3.1415926535" & vbNewLine & _
             "珠穆朗玛峰高度8848.0" & vbNewLine & _
             "光速是300000000米/秒" & vbNewLine & _
             "马里亚纳海沟最大长度: 2550,平均深度: 8000," & vbNewLine & _
             "最大宽度: 69,最大深度11034"
    MsgBox strTxt & vbNewLine & vbNewLine & _
           objRegEx.Replace(strTxt, "$1,")
    Set objRegEx = Nothing
End Sub

结果如下图所示。

(0)

相关推荐

  • ​不规则内容提取-正则表达式

    常逛论坛的同学应该有看到这个案例,我们就通过这个案例来说一下,不规则特征字符提取的问题! 示例如下: 整体看上去有一定的规则,但是仔细看,会发现不是很明显,有的是从第一个"-"开始 ...

  • 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代码逐个判断字符和其前后的字符对比,就可以区分每组,高手可以写出 ...