精华内容
下载资源
问答
  • 支持win10,没有替换功能,可以替代vba进行的测试工具
  • VBA正则表达式入门与提高

    万次阅读 多人点赞 2019-05-10 11:30:37
    精通正则表达式>>专业书籍是世人公认的正则权威著作.但它不太适合初学者,尤其是没有相关编程语言背景及书中所及的种种计算机技术知识的读者.其中很多晦涩难懂的内容在VBA中用不上或者对你来说根本无用的,而...

    有一位美国佬编写的<<精通正则表达式>>专业书籍是世人公认的正则权威著作.但它不太适合初学者,尤其是没有相关编程语言背景及书中所及的种种计算机技术知识的读者.其中很多晦涩难懂的内容在VBA中用不上或者对你来说根本无用的,而初学者的你却根本不知道怎样取舍.事实上,本人还没有发现一本针对VBA平台的正则专业书籍.网络可见到少量VBA正则教程,但内容多是”点到为止”.

          鉴于此,有此贴文.在这里感谢本论坛liucqa老师的鼓励,在之前本人写过一篇正则对象操作的短文,liucqa老师留贴建议多写一点,但一致未能成文.此帖算是对liucqa老师的交代.

    内容提要

     目录

    第一篇 基础篇

    一、        正则表达式概论—理解正则表达式

    二、        正则表达式与VBA的交互—正则表达式的实现

    三、        正则元字符—字符的表示法

    四、        正则元字符—数量的表示法

    五、        正则元字符—位置的表示法

    六、        正则元字符—分组及控制表示法

    第二篇 进阶篇

    一、        元字符与字符集

    二、        ^$的位置到底是哪里

    三、        字符组内部元字符转义规则

    四、        字符组与多选结构“|”

    五、  否定环视与否定字符组

    六、  顺序环视的多角度理解与应用

    第三篇 原理篇

    一、匹配的基本术语

    二、匹配总原则

    三、正则表达式匹配的基本过程

    四、回溯

    五、回溯的总结

    六、回溯与效率

    七、灾难回溯

    第四篇 技巧篇

    一、匹配具有多种形态结构的字符串

    二、匹配特定位置上的字符串

    三、匹配其内部由相似结构字符串构成的字符串

    四、在一大段文本中,匹配一对特定字符串之间的字符串

    五、匹配一对特殊字符界定的之间的字符串,但其内部包含两端的界定字符

    第一篇 基础篇

    一、正则表达式概论----理解正则表达式

          文本处理是一项常见的工作任务,比如:在一段文本或数据中,查找、替换、提取、验证、分离和删除等特定字符或字符串。在几乎所有文本编辑器中(如word/excel/VBE等)都提供了字符串的查找/替换功能;在编程语言的世界里更是提供了丰富的字符处理函数和方法。VBA中有Find(查找某字符串)、Replace(用一字符串去替换文本中的另一字符串)、LIke(判断某字符串是否存在)等等。

         编程语言本身提供的字符处理函数或方法,具有用法简单、处理快速和使用便捷的特点。不过这些函数或方法也存在很大缺陷:它们通常都是对非常具体的字面文字进行操作,假如要处理某一类具有某些相似特征的字符或字符串,就显得力不从心了。举个例子,要求在一大段文本中,查找所有的符合规范的电子邮箱。如果用VBA本身提供的字符处理函数来处理,显然不是一件容易的事。可见,在现实的世界里对复杂动态文本的处理,仅靠编程语言本身是不够的。为此,人们找到了一种功能更为强大的文本处理解决方案----正则表达式方案。

         正则表达式是强大、便捷、高效的文本处理工具。利用它使用者可以描述和分析任何复杂的文本,配合编程语言或文本编辑器提供的支持,正则表达式能够查找、替换、提取、验证、添加、删除、分离和修整各种类型的文本和数据。当今主流编程语言(如:java/C#/C++/.net/php/pcre/perl等)几乎都提供了对正则表达式的支持;有些文本编辑器(如Dreamweaver)在编辑查找框中也可直接输入正则表达式,实现不限于字面文字的搜索与替换.VBA虽然只是对正则提供简单支持,但是它也可以完成一些用VBA函数或方法难以处理的文本处理任务。

    (一)正则表达式方案处理文本的基本思路

          1、显然,无论进行何种文本处理操作,首先要在目标文本中找出指定的字符串,而要查找它们必须得描述出该字符串的特征。比如,你要验证用户输入的是否是一个正确的电子邮箱,肯定不可能去枚举世界上所有存在的电子邮箱,因而首先得依据电子邮箱规范,建立一个电子邮箱的模式,然后比照该模式到文本中去查找验证,从而判断目标文本中是否存在与模式相吻合的字符串(这个过程也称之匹配过程,查找到的结果叫”匹配”)。一个简单的电子邮箱模式可以表示为:

    ^\S+@\S+$

        这个代码模式就是电子邮箱的正则表达式,所以正则表达式是一种可以在许多现代应用程序和编程语言中使用的特殊形式的代码模式。编制这样的代码模式,也就是编制正确高效的正则表达式,是我们学习和研究正则表达式的主要任务。

          2、如何将编制好的正则表达式应用于编程语言,实现我们真正的需要,这是学习和使用正则的第二个问题,在这一点上,不同的编程语言其实现方式是不一样的.庆幸的是,较之编制正则表达式,掌握它们是非常简单的事。我们会在本篇的第二章“正则与VBA的交互”中详细论述。

    (二)正则表达式的基本组成单元—元字符(序列)

         从电子邮箱的正则表达式(^\S+@\S+$)可以看到,正则表达式是由一些”特殊字符”组成的。人们常常把这些组成正则表达式的”特殊字符”称之为元字符。元字符是正则表达式事先规定或约定的,用来表示字符、位置、数量和控制的专用符号。在组成正则表达式的元素中,有的是由两个或多个特殊字符组成一个单元,表示单一意义。如上面电子邮箱正则中,”\S”表示一个非不可见字符,我们可以称之为元字符序列.在正则表达式中也可以有字面字符,如邮箱正则的字符“@”,在这时表示的是字面上”@”.所以从形式上观察,正则表达式是由元字符、元字符序列或字面字符组成的,用于描述字符或字符串特征的一个代码模式.正则表达式也可以仅由字面字符组成,如”正则ABC”.

         你是否有一种似曾相识的感觉?对!这不是什么新鲜的想法.远古的DOS时代,前辈门就曾用*号代表任意多个字符,用?号代表一个任意字符,那时称之为“通配符”;当下的VBA中Like函数的参数里有更多的特殊字符或结构,用来描述字符或字符串模式.不过,正则表达式里,那些”特殊字符”更多,语法规则更丰富,可以认为,它相当于是一门”微型”语言.

           接下来,本章会把所有的”元字符(序列)”分类展示给你,不是要你立马记住或掌握它,目的是让你有个概貌,避免在以后的学习中迷失方向.

    1.正则表达式规定了多种方法或符号用来表示世界各国使用的文字字符。如:

    下面列举了VBA中正则表示字符的所有元字符(序列),在以后的章节中会详细介绍.

    (1)  常用不可打印字符:\n\t\f\r\v

    (2)  八进制转义:\num    (num是一个八进制数)

    (3)  十六进制转义:\xnum (num是一个十六进制数)

    (4)  Unicode转义:\unum  (numunicode代码点)

    (5)  控制字符:\cchar       (charA-Z之间的任意字母)

    (6)  普通字符组:[a-z][^a-z]

    (7)  几乎能匹配任何字符的元字符:英文句点

    (8)  字符组缩略表示法:\w\d\s\W\D\S

    2.表示字符或字符串数量(连续出现的次数)的元字符:*、?、+、{n}、{n,m} 例:

    3.表示位置的元字符(序列):^、$、\b、\B、(?=…)、(?!...)例:

    4.在正则表达式中起分组、捕获和控制作用的元字符(序列):

    (…)、(?:…)、\1、…|…|…、*?、+?、??、{num,num}?

    例:

     

    捕获9.PNG (22.65 KB, 下载次数: 921)

    捕获.PNG (22.47 KB, 下载次数: 834)

     

    (三)用正则处理文本的一个例子

         我们已经认识了几个简单的元字符(序列),并能用它们构建一些实用的正则表达式,那么,怎样把它们应用于VBA中呢?,下面我们用正则在VBA中来完成一个简单的任务:

         目标文本:”正则表达式其实很简单     “

         任务:删除目标文本中行尾空格.

        分析:

        1.\s可表示空格,+表示出现一个或多个字符,所以可用”\s+”表示连续多个空格.$表示一行的行尾,于是可用以下正则表达式描述行尾的若干空格:

        \s+$

        2.我们把上面的正则代码表达式作用于目标文本,查找与模式吻合的字符(串),并用空字符替换,从而达成实现删除空格任务。

        下面是完整的VBA代码:

    Sub Test()

        Dim regx, S$, Strnew$

        S = "正则表达式其实很简单     "

        Set regx = CreateObject("vbscript.regexp")

        regx.Pattern = "\s+$"

        regx.Global = True

        Strnew = regx.Replace(S, "")

        MsgBox Strnew

    End Sub

        这个简单的例子说明了正则实现的一般步骤:

    1、        创建变量:这个例子中,变量regx是一个对象,S是字符串变量;Strnew也是字符串变量.

    2、        把目标文本赋值给变量S

    3、        创建一个正则对象regx

    4、        设置正则对象regx的pattern属性,即把正则表达式以字符串形式赋值给pattern.

    5、        设置正则regx对象的其它属性,例子中设置Global属性为真

    6、        应用对象提供的方法,实现相应功能.例子中,利用regx对象的Replace方法实现替换.

    7、        输出处理后的字符串.

        到这里,你已经完全了解了用正则处理文本的基本过程和思路,以及在VBA中使用正则的代码框架.以后的任务是全面掌握正则的所有元字符和它们的工作原理,另外还需要进一步了解正则对象的各种属性和方法.

        要提醒的是,”基础篇”的应用实例或许并不是解决该任务的最佳方案,也或许是一些看似很无聊的例子,但请不要忽视它们.正是透过这些简单的实例,揭示了概念的本质.

     

     

    补充内容 (2014-6-20 19:04):

    最近看了liucqa老师一个贴子,在处理"大字符串"时,即使可用VBA函数或方法处理,但不如用正则处理速度快.比如:用Split将用逗号连接的10万个数字字符串转化的为数组,如果用正则处理,只需要一半的时间.

     

    补充内容 (2016-6-8 07:30):

    本页例中的regx.Global=True语句,此时不是必须的,只是为了说明属性的应用.

    .正则与VBA的交互—正则表达式的实现

          在继续学习正则元字符特性或编制自己的正则表达式时,常常需要对其测试.你可以用一些专门的正则测试工具(推荐RegxBuddy);也可以自己编制VBA代码进行测试。不过建议初学者,经常编写VBA代码进行测试,这样可以提高今后实际应用正则的能力。所以,在进一步学习正则元字符特性之前,我们先介绍正则与VBA的交互的相关知识。你可以快速阅读或越过本章内容,在以后具体应用时,再经常回头查阅。当然也可以用上一章学到的知识详细研究本章内容,在以后的学习中专注于正则表达式本身.

          用正则处理文本,是通过正则表达式与程序设计语言的交互来实现的。其交互方式在不同编程语言中分为三大类:

          一是集成式。Perl语言本身内建正则操作符,可以直接作用于正则表达式.操作符作用于正则表达式就像数学的+-号作用于数字一样.不需要构建正则对象。例如:任务是要把变量$text保存的文本中的空行替换为标签(<P>)。

    正则表达式

    ^$         表示空行.

    在Perl语言中,可以用一句代码实现替换:$text=~ s/^$/<p>/g

          二是函数式处理。Java等语言,为正则处理提供了一些便捷函数,以节省工作量.用户不需要首先创建一个正则对象,而是用静态函数提的临时对象来完成正则处理,处理完后把临时对象抛弃. 正则表达式对于函数相当于一个参数, 这种方式的优点是”随手”可用,但不适宜在对时间要求很高的循环中使用.所以java也提供了下面讲到的面向对象的程序式处理.

         三是面向对象的程序式处理。这是大多数编程语言的正则处理方式。VBA平台采用的也是这种方式。面向对象的程序式处理方式,首先必须创建一个正则对象的实例,然后设置对象必要的属性,最后用对象的方法来完成指定的任务。(提示:不同编程语言的正则对象具有的属性和方法,其项目多少或功能强弱有所不同,所以,在VBA中使用正则如果发现没有某种其它语言的方法或属性,请不要感到困惑)

     在上一章中,我们给出了一个用VBA删除行尾空格的正则处理例子,它代表了一般的代码框架模式,下面再看一看它的结构特点,并对每一部分的代码段进行剖析:

    Sub test()

        Dim regx,S$,Strnew$                                       1.定义变量代码段

        S=”正则表达式其实很简单     “                   2.目标文本字串变量赋值代码段

        Set regx=createobject(“vbscript.regexp”)   3.创建正则对象代码段

        Regx.pattern=”\s+$”                                       4.设置正则对象的pattern属性代码段

        Regx.global=true                                              5.设置正则对象的其它属性代码段

        Strnew=regx.replace(s,””)                              6.应用正则对象方法代码段

        Msgbox strnew                                                 7.处理返回值代码段

    End sub

    1.定义变量代码段

          不必讲解了吧.

    2.目标文本字符串赋值代码段

          目标文本,可能存在于文本文档、Word文档、HTML文档或Excel文档等文档之中。正则对象并不能直接作用于这些文档,只能作用于它们的副本。所以用VBA正则处理这些文档,必须首先从这些文档中读出字符串并赋值于字符变量。如果任务是修改文本,那么,你可能需要编写额外的代码将修改后的文本字符串重新写回原文档中.

          例:假如目标文本存在于当前表格A1单元格中.可使用下列代码赋值于字符变量S

           S=Activesheet.[a1]

         目标文本也可能分别存在于一个数组中,那么,你可能需要通过循环逐一处理.

         你也可以直接以输入的方式,赋值给字符变量,就像上面的例子.这时特别注意的是:半角双引号是VBA语言中的保留字符,如果目标文本中本身含有半角双引号,则必须转义,转义方法是:用重复的双引号表示一个双引号.

         例:目标文本为:”我们用”汗牛充栋”、”学富五车”形容一个人读的书、拥有的知识多。”.

         将之赋值给S的代码为:

          S=”我们用””汗牛充栋””、””学富五车””形容一个人读的书、拥有的知识多。”

     3.创建正则对象代码段

         文本处理的各种操作,都是通过操作正则对象来完成的.所以必须创建正则对象.VBA创建或声明正则对象有两方式:早期绑定和后期绑定,你可以根据自己喜好选择其一:

         早期绑定: (需要在VBE--工具--引用中勾选Microsoft VBScript Regular Expressions 5.5)

         Dim regx AS RegExp

         Set regx=new regexp (或dim regx as new regexp)

        后期绑定:

                Set regex = CreateObject("VBScript.RegExp")

         利用上述两种方式创建或声明正则对象,实际上是调用Microsoft VBScript脚本的regexp正则对象。Microssoft VBScript脚本,包含在Internet Eeplorer 5.5以及之后的版本中.该脚本中的正则表达式执行的是ECMA-262第3版所规定的标准,与JavaScript脚本中的正则执行标准是相同的。1.0版只是为了向后兼容的目的,功能很弱。

          (提示:在VBA中也可调用JavaScript(Jscript)或ruby等脚本中的正则对象,Jscript的元字符及特性与VBscript是一样的,但它的方法或属性要多一点,或者说对正则的支持更强一些.ruby本人不懂,不太了解它的元字符集,只是看到论坛上有人使用)

         4.设置对象的pattern属性

        语法:object.pattern=”正则表达式”

        Object是一个正则对象.

       把自己编制的正则表达式,以字符串的形式赋值给pattern属性。注意要用英文双引号将正则表达式包围起来.

       并且要在对象名与属性名之间用英文点号隔开.属性名pattern是保留字,固定不变的,对象名是用户自定义的。

       接下来的两个步骤是对正则对象的操作,通过设置或使用正则对象的属性和方法,以实现对文本的处理.正则对象的属性和方法不多,列表于下:

    5.设置对象的其它属性

          除Pattern属性外,正则对象还有其它三个属性,其属性值有False和True,默认值都是False。如果要使用默认属性,可以不用显示设置;如果要改变默认属性,则需要显示设置:

          Global               当属性值为False时,只要在目标文本中,找到一个匹配时,即停止搜索。如果想要找出目标文本中的所有匹配,那么需要把它的属性值设置为True。

          IgnoreCase        设置对英文字母大小写是否敏感。默认值False, 对大小写敏感;设置为True,忽略大小写.

          MultiLine            它影响且只影响元字符^和$的意义。值为False,无论目标文本是多少行,整个文本中则只有一个开始位置,^表示第一行的开始;只有一个行结束位置,$表示文本末尾位置。值为True,那么,^和$分别表示每一行的行首和行尾位置。

          下面来完成一个简单的任务,再具体认识各属性的使用方法:

          有一两行的文本:

          Aaa

          Bbb

          任务要求:

          1.在文本开始和结束处,分别插入一个”@”符号;

          2.在文本每行的开始和行尾分别插入”@”符号。

          正则表达式:

          ^|$                表示匹配行开始或结束位置

          任务1代码:

    Sub test1()

        Dim reg, s$

        s = "Aaa" & vbLf & "bbb"   '这里用vblf 表示行之间的换行符

        Set reg = CreateObject("vbscript.regexp")

        reg.Pattern = "^|$"

        reg.Global = True

        s = reg.Replace(s, "@")

        MsgBox s

    End Sub

    讨论:

            Msgbox 最后显示的结果为:

    @Aaa

    Bbb@

          代码中修改了global的默认属性值,设置为true;目的是保证能找到并替换全部的开始或结束位置。如果保持默认属性,则只会在开始处插入一个@号。

          正则对象Reg的其它两个属性保持为默认。因为本任务无关乎字母大小问题,所以IgnoreCase属性无需要设置为Ture(当然如果设置为true,对最后结果也无影响);由于Mutiline属性保持默认,其值为False,所以整个文本只有一个开始位置和一个结束位置。

           代码中使用了对象reg的replace方法,它的作用是,将在目标文本中找到的匹配(开始和结束位置)替换为”@”字符,在这里实际上是插入。然后把修改后的文本返回,重新赋值给字符变量S。

          任务2代码:

    Sub test2()

        Dim reg, s$

        s = "Aaa" & vbLf & "bbb"

        Set reg = CreateObject("vbscript.regexp")

        reg.Pattern = "^|$"

        reg.Global = True

        reg.MultiLine = True

        s = reg.Replace(s, "@")

        MsgBox s

    End Sub

         讨论:

          任务2代码与任务1代码唯一区别是修改了mutiline默认属性,设置为True。这就意为着,该文本的每一行都存在一个开始位置和结束位置。所以Msgbox最后显示的结果为:

    @Aaa@

    @Baa@

    6.应用对象的方法代码段

          VBScirpt正则对象的方法共有三个:你可以根据任务要求选择使用一个或多个方法.

          (1)TEST方法

          语法:Object.Test(string)

          Test方法只是简单测试目标文本中,是否包含正则表达式所描述的字符串。如果存在,则返回True,否则返回False。

          例:用代码检测用户的输入是否是一个电子邮箱。

    Sub ChkEmail()

        Dim reg, s$

        s = InputBox("请输入一个电子邮箱:")

        Set reg = CreateObject("vbscript.regexp")

        reg.Pattern = "^\S+@\S+$"

        If reg.Test(s) Then

            MsgBox "你输入的电子邮箱格式正确:  " & s

        Else

            MsgBox "你输入的电子邮箱格式不正确!"

        End If

    End Sub

         讨论:

         代码从用户那里获得字符串,然后赋值与字符变量S。验证邮箱的正则表达式非常简略,元字符序列"\S"表示不是空格的任意一个字符,后面紧跟一个+号表示一个以上字符。这个表达式事实上只验证了用户的输入里,在字符串之间是否有一个@符号。它甚至认为”0@中”都是正确的。下面给出一个更为严格的电子邮箱正则表达式:“^[\w.-]+@[\w.-]+$”当然要严格按电子邮箱规范写出正则表达式,可能就十分复杂,由于我们刚刚接触正则,就不在详细讨论了。

          这里要关注的是,test方法的语法,在方法与正则对象之间也是用英文点号隔开,作为参数,目标字符串用英文括号包围。在这个例子中,如果Test返回的是true,表示目标文本S中找到了正则模式的匹配。则显示正确结果,否则显示错误提示。

         (2)Replace方法

         替换在目标文本中用正则表达式查找到的字符串。

         前面例子中语句体现其语法:s=reg.replace(s,”@”)

         后面括号中的参数S,代表前面代码中设置的目标文本字符串.也就是正则表达式将要作用的目标文本.”@”是用来替换的字符串参数.前面的s是Replace方法返回的结果,它是目标文本被替换后的一个副本. 如果没有找到匹配的文本,将返回与目标文本一样的一个副本.

        下面继续讨论Replace方法的第二个参数:

         例子中"@"是一个字面字符,要用一对双引号包围起来。第二个参数还可以是变量、表达式。如果是变量或函数则不能用双引号包围,这一点和VBA代码规则是一致的.

         上一章我们知道了如果在正则表达式中使用了元字符序列()括号,那么被圆括号包围的内容会存储在特殊变量$1中。在有些编程语言中,可以直接在正则代码外使用$1变量,而VBScript中可以并只可以在Replace方法中,作为第二参数来调用。

         例子:在目标文本中的数字数据后增加上单位:KG

         目标文本:“他们体重分别是:张三56,李四49,王五60。”

         结果文本要求: “他们体重分别是:张三56KG,李四49KG,王五60KG。”

         正则表达式:(\d+)

         替换文本:        $1KG

    Sub testrep()

        Dim reg, s$

        s = "他们体重分别是:张三56,李四49,王五60。"

        Set reg = CreateObject("vbscript.regexp")

        reg.Pattern = "(\d+)"

        reg.Global = True

        s = reg.Replace(s, "$1KG")

        MsgBox s

    End Sub

        讨论:

         用正则表达式(\d+),Replace方法将在目标文本中找到三个匹配,其值分别是56,49,60。并分别把每个值保存于每一个匹配对象的$1变量中。

         替换文本:”$1KG”表示每一个匹配中的$1变量值与字面字符”KG”联结,组成新字符串,用来替换找到的数据字符串。

         $1是一个很特殊的变量,它由美元符号与数字编号组成.如果正则表达式中有两个或两个以上的捕获性括号,则按照左括号”(“从左到右顺序编号,自动命名为$1,$2,$3….,共支持99组.要指出的是,如果找到多个匹配,那么每个匹配中的特殊变量名是一样的.这个例中共有三个匹配其值分别为56,49,60.第一个匹配的变量名是$1,第二和第三个匹配的变量名仍然是$1,只是每个匹配中$1保存的值是不一样的.

        最后一点,作为替换参数的一部分,$1变量与字面字符共同组成替换字符串时,它们之间不用 & 符号连接,并且 $1 必须放在一个双引号中;而如果是用其它普通变量与字面字符联结组成替换文本时,则必须用 & 符号联接,这一点与VBA代码使用方法相同.

         在Replace方法的第二个参数中,还有几个很少用到的特殊变量:

       一个较特殊的状况,如果上面所述的特殊变量符不是作为变量使用,而是要以它们作为字面字符的替换文本,那么就要对它们转义,方法是在它们之前加一个美元符号$.如$$&

     

     (3)Execute方法

         在目标文本中执行正则表达式搜索。

         语法:set mh=object.execute(s)

         其中mh是用户自定的对象变量,S是值为目标文本的字符串变量.object是正则对象.

         Execute方法会作用于目标文本(S),并返回一个叫作"Matches"的集合对象,在这里是mh.在这个集合对象中包含它找到的所有叫做"Match"的成功匹配对象(Matches集合最多可容纳65536个匹配对象). 如果未找到匹配,Execute 将返回空的 Matches 集合。Matches集合有两个只读属性:索引(Item)和成功匹配的次数(Count).

         Matches集合中包含的匹配对象Match有四个只读属性:Value/firstindex/length/submatches

         值得一提的是,Submatches属性是一个集合属性,集合中元素个数与正则表达式中使用的捕获性括号的个数相同,每个元素的值就是括号包围起来的内容.它也有两个只读属性:item和Count

       下面用树状图来表示它们之间的关系,并在接下来的内容中继续逐一讨论它们的用法.

     

      <1>Matches集合的Item和Count属性

         利用Matches集合的Item属性可以得到它包含的每个Match对象;利用Count属性可以得到成功匹配的个数.

        Matches集合对象中元素(成功匹配)的索引编号从0开始.我们可以用遍历集合的方式或索引方法读取每一个匹配值.

         例:从一段文本中提取所有英文单词.

         目标文本:”苹果:iphone_5s;诺基亚:Nokia_1020”

       结果要求:分别提取出iphone_5s和Nokia_1020

    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    代码:

    Sub test2()

        Dim reg, k, mh, strA$

        strA = "苹果:iphone_5s;诺基亚:Nokia_1020"

        Set reg =CreateObject("vbscript.regexp")

        reg.Pattern = "\w+"

        reg.Global = True

        Set mh = reg.Execute(strA)

        For Each mhk In mh

            Debug.Print mhk.value

        Next

    End Sub

    讨论:

      通过语句Set mh = reg.Execute(strA),Execute方法返回一个集合对象mh,在这个集合对象里包含两个匹配对象,代码中用遍历方法取出每一个匹配对象的值.

      Execute方法返回的集合对象mh,有两个属性:

      1)Count:      Execute方法成功匹配的次数,也可理解为mh集合对象中包含的成功匹配对象的个数.语法:

          N=mh.count   本例中n值为2

      2)Item: 索引,可以通过索引值,返回集合对象中指定的匹配对象.语法:

          Set mhk=mh.item(0)

          K=mhk.value

      用索引返回第一个Match对象即mhk. 本例中k为第一个Match对象的值(iphone_5s). 同样的方法可以得到第二匹配的值.

       由于Item和Value属性是集合的默认属性,所以上面两个语句也可简写为:

          K=mh(0)......第一个匹配对象的值(iphone_5s)

                   M=mh(1)...........第二个匹配对象的值(Nokia_1020)

      上面代码中遍历集合也可以用索引法遍历:

      For i=0 to mh.count-1

        Debug.print mh(i).value

      Next i

    <2>Match对象的属性

      Execute方法返回的集合对象中包含的也是对象元素,即match对象,match对象有四个属性:

      FirstIndex:匹配对象所匹配字符串的起始位置。

      Length:匹配对象所匹配字符串的字符长度。

      SubMatches:匹配对象所匹配结果中的子项集合。

      Value:匹配对象所匹配的值。

      在本例中:索引为0,即第一个匹配对象的属性值为:

      K=mh(0).value   k的值为iphone_5s,value是默认属性可简写为k=mh(0)

      sn=Mh(0).firsindex   sn的值为3,表示在目标字符串中,位置3上找到该匹配iphone_5s.(位置是从0开始的)

      Ln=mh(0).length   ln值为9,即iphone_5s的字符长度

    3>Match对象的Submatches属性  

      匹配对象match的Submatches是一个集合属性,它包含正则表达式中用圆括号捕捉到的所有子匹配.它为用户提供了返回$1特殊变量值的方法.

      集合Submatches有两个固有属性:Count和Item.可以通过Item得到集合中的每个值,它实际就是在正则表达式中用圆括号捕获的内容;Count值是集合中元素个数,实际上就是正则表达式中捕获性圆括号的个数.

    下面给一个实例来说明:

       目标文本:给定一个标准邮箱地址:J3721@163.com

       要求:从邮箱中分别提取出:用户名j3721,服务器域名163.com

       正则表达式:  ^(\w+)@(.+)$

       代码:

    Sub test5()

         Dim reg, mh, strA$, username$, domname$

         strA = "J3721@163.com"

         Set reg = CreateObject("vbscript.regexp")

         reg.Pattern = "^(\w+)@(.+)$"

         Set mh = reg.Execute(strA)

         N=mh(0).submatches.count         ‘n值等于2

         username = mh(0).submatches(0)    ‘j3721

         domname = mh(0).submatches(1)    ‘163.com

    End Sub

    讨论:

       正则表达式中,\w+表示匹配@前面的所有英文单词字符;@后面的点号是一个元字符,表示匹配除换行符外的所有字符之一,后面紧跟+号,即”.+”表示匹配@后面除了换行符外的所有字符.用括号包围起来,用户名和域名就会自动分别保存在变量$1和$2中.

       前面已经知道VBA不能在replace之外直接调用$1或$2,而这个例子告诉我们可以用match对象的submatches集合属性来提取.

       在这个例子中,execute方法返回的集合对象mh中,mh中只有一个匹配对象Match,即mh(0);mh(0)对象的属性submatches(0),返回第一个括号中的内容,即j3721.而submatches(1),返回第二个括号中的内容.submathches集合也有count属性,所以如果有很多子项需要提取,也可用遍历或索引方法返回每一个特殊变量值.最后再给一例子:

       下面的代码演示了如何从一个正则表达式获得一个 SubMatches 集合以及它的专有成员:

      正则表达式(一个邮箱地址):

       (\w+)@(\w+)\.(\w+)

       如果你没有进一步了解元字符,可能不懂其中含义,不过没关系,在这里你只要知道,该代码的任务是显示电子邮箱dragon@xyzzy.com,用户名和组织名.

    Function SubMatchTest(inpStr)

      Dim oRe, oMatch, oMatches

      Set oRe = New RegExp

      ' 查找一个电子邮件地址

      oRe.Pattern = "(\w+)@(\w+)\.(\w+)"

      ' 得到 Matches 集合

      Set oMatches = oRe.Execute(inpStr)

      ' 得到 Matches 集合中的第一项

      Set oMatch = oMatches(0)

      ' 创建结果字符串。

      ' Match 对象是完整匹配 dragon@xyzzy.com

      retStr = "电子邮件地址是: " & oMatch & vbNewline

      ' 得到地址的子匹配部分。

      retStr = retStr & "电子邮件别名是: " & oMatch.SubMatches(0)   ' dragon

      retStr = retStr & vbNewline

      retStr = retStr & "组织是: " & oMatch. SubMatches(1)          ' xyzzy

      SubMatchTest = retStr

    End Function

    Sub SubMatchesTest()

       MsgBox(SubMatchTest("请写信到 dragon@xyzzy.com 谢谢!"))

    End Sub

    如果知道一点英文,理解记忆会更快。

    \w

    → word 首字母 w

    表示26个英文字符【A-Za-z】以及下划线【_】和数字【0-9】的集合,

    .Pattern ="\w" 等价于 .Pattern ="[0-9a-z_A-Z]"

     

    其中有英文字符很好理解,因为英语中的word肯定是由英文字母构成的。

    另外,在VBA编程中,变量还可以含有数字和下划线,因此数字和下划线也被当做构成统一word的要素。

    除此之外的其它字符,都不算构成word的要素了。

    \d

    → digit 首字母 d

    表示数字【0-9】的集合,

    .Pattern ="\d" 等价于 .Pattern ="[0-9]"

    \s

    → separate 首字母 s   或space、tab、return简称str字符的首字母。

    表示分隔符号 含space 空格【 】或【char(32)】、回车vbCr【char(13)】、换行vbLf【char(10)】、vbTab【char(9)】等,

    全部ASCII码值为: char(9)、char(10)、char(11)、char(12)、char(13)、char(32)(空格)

     

    分隔符号的单独分开是\t   tab 首字母  vbTab【chr(9)】或 其反集 \T  

     

    \v   verticaltab 首字母  vbVerticalTab【chr(11)】或 其反集 \V  

     

    \f   formfeed 首字母  vbFormFeed【chr(12)】或 其反集 \F

     

    \r   回车 return 首字母 r 而在VBA中对应的是:vbCr【chr(13)】或 其反集 \R   (Cr是Carriage Return的简称,是机械式打字机时代,字车carriage回复return 到最左边开始的意思 )

         苹果机(MAC OS系统) 采用回车符Cr 表示下一行.

     

    \n   换行 newline 首字母n  vbLf【chr(10)】或 其反集 \N

       (Lf是Line Feed的简称,是机械式打字机时代,回车的同时自动滚进一行的意思 )

         UNIX/Linux系统采用 换行符Lf 表示下一行.

     

    \r\n 回车换行  vbCrLf【chr(13) & chr(10)】

         Dos和windows系统 采用 回车+换行CrLf 表示下一行,

     

     

    =================

     

    接下来介绍,对上述几个常用元序列/集合,使用小写字母时是有效,含有的意思,

    而使用大写字母时是无效,排除(不含有)的意思,

     

    如:

     

    \W → word 首字母 大写 W 标记的【英文字母、数字、下划线】的序列/集合的反集

     

    小写字母w .Pattern ="\w" 等价于 .Pattern ="[0-9a-z_A-Z]"

     

    大写字母W .Pattern ="\W" 等价于 .Pattern ="[^0-9a-z_A-Z]"

     

     

    2.

     

    \D → digit 首字母 大写 D 标记的【数字】的序列/集合的反集

     

    小写字母d .Pattern ="\d" 等价于 .Pattern ="[0-9]"

     

    大写字母D .Pattern ="\D" 等价于 .Pattern ="[^0-9]"

     

     

    3.

     

    \S → separate 首字母 大写 S 标记的不可见换行字符的序列/集合的反集

     

    小写字母s .Pattern ="\s" 等价于 含有char 9,10,11,12,13,32

     

    大写字母S .Pattern ="\S" 等价于 含有char 9,10,11,12,13,32

     

     

    =======

    以上

    \b 和 \B

     

    begin 的首字母 b

     

    意义: 以上述\s separate 集合分隔后得到的每一个 \w word 中的第1个begin字符。

     

    如:

    abe sau

    dty12 f_34

     

    执行小写字母b .Pattern ="\b." 则得到每一个word的首字母:a s d f

     

    =====

     

    执行大写字母B .Pattern ="\B." 则得到每一个word的首字母以外的字符:b e a u t y 1 2 _ 3 4

     

     

    ====

    以上。

     

    补充,该规则仅对英文word能100%正确作用。

    如果对象字符集中出现\W字符即非英文数字下划线字符,如汉字或其他符号,

    则可能会返回不可预知的结果。(因为汉字等其它词汇无法像英文那样简单区分word和word之间的间隔。)

    (如同Vlookup函数中搜寻数组中没有正确A-Z排序时可能返回不可预知结果一样。)

    展开全文
  • VBA的运算符和表达式

    千次阅读 2017-01-02 12:16:43
    VBA的运算符和表达式——百度文库 本文从广义的角度将VBA的运算符进行了全面的归纳和总结,包括通常意义上的算术运算符、连接运算符、比较运算符和逻辑运算符,还包括了赋值运算符、点运算符以及Like运算符、...

    VBA的运算符和表达式——百度文库

    本文从广义的角度将VBA的运算符进行了全面的归纳和总结,包括通常意义上的算术运算符、连接运算符、比较运算符和逻辑运算符,还包括了赋值运算符、点运算符以及Like运算符、AddressOf运算符等。同时,概述了表达式的知识。 


    提示 学习是需要思考和实践的,只有举一反三,才能真正理解和掌握。因为VBA的一些运算符涉及到较强的逻辑关系,您在阅读本文时,可以不断思考它们之间的逻辑关系。同时,您可以在VBE编辑器的模块中测试本文中的一些语句和示例,以加深认识。 


    在使用VBA编程时,您一定会经常使用到VBA运算符,它是VBA程序的重要组成部分。在本文中,我将运算符分为两大类,一类是通常意义上的运算符,即:算术运算符、连接运算符、比较运算符和逻辑运算符;另一类是与语句相关的运算符,即:赋值运算符和点运算符。此外,还简略地介绍一下Like运算符和AddressOf运算符。 

    您通过使用运算符,对VBA各种元素进行连接,或者完成一些运算以形成了VBA表达式或语句。再进一步说,表达式是数字、字符串、常量、变量、对象成员、以及运算符的组合。 算术运算符和表达式 


    ■ 算术运算符包括+(加法运算符)、- (减法运算符)、/ (除法运算符)、\(整除运算符)、Mod(取模运算符)、^(乘幂运算符),下面逐一进行介绍。 
    + 加法运算符。形成数值表达式,并将数值或数值表达式相加。也可用于连接两个字符串变量,但建议用连接运算符进行连接。例如,结果=表达式1+表达式2。 
    - 减法运算符。形成数值表达式,将数值或数值表达式相减。也可用在数值之前,用于表示负数。例如,结果=表达式1-表达式2。 
    * 乘法运算符。形成数值表达式,将数值或数值表达式相乘。例如,结果=表达式1*表达式2。 / 除法运算符。形成数值表达式,将两个数值或数值表达式相除,其中除数不能为零,否则会得到一个错误。例如,结果=表达式1/表达式2。 
    \ 整除运算符。将两个数值或数值表达式相除,并返回一个整数,即舍掉余数或者小数部分。例如,结果=表达式1\表达式2。例如,7\3的值为2。 
    Mod 取模运算符。将两个数值或数值表达式相除,并只返回余数。例如,结果=表达式1 Mod 表达式2。例如,7 Mod 3的值为1。 
    ^ 乘幂运算符。计算数值或数值表达式的乘幂。例如,结果=数值 ^ 指数。 ■ 算术运算符的优先顺序 
    算术运算符的优先顺序依次为:乘幂运算符(^)——乘法和除法运算符(*、/,两者没有优先顺序)——整除运算符(\)——取模运算符(Mod)——加法和减法运算符(+、-,两者没有优先顺序)。若在同一代码中多次使用同一个算术运算符,则从左到右运算。使用括号可以改变优先顺序。 连接运算符和表达式 
    & 连接运算符,用于连接字符串。它能把一些字符串变量连接在一起,形成一个新的字符串。在进行连接运算之前,任何非字符串变量或表达式都转换为字符串。例如,结果=字符串1&字符串2,其结果的数据类型为String类型。 
    + 混合连接运算符,它运用很灵活,但会与加法运算符相混,给您的阅读带来不便。例如,结果=表达式1+表达式2,其结果的数据类型取决于表达式的数据类型。 下面对这两种连接运算符进行测试,测试表达式为:     结果=表达式1+表达式2 
    当两个表达式都是数值数据时,用&运算符会将两个数值数据连接,如5 & 1连接后为51,但用+运算符后,会将两数值相加得到其结果,如5+1进行连接后为6。当两个表达式都是字符串(Sting)时,将对两个字符串进行连接为一个字符串。当两个表达式为空时,+运算符的结果为0,而&运算符的结果为Null值。当一个表达式为数值类型数据,另一个表达式为字符串类型数据时,+运算符将产生类型不匹配的错误,而&运算符则将两个表达式连接。未声明变量时,当一个表达式为数字,另一个表达式为字母时,+运算符和&运算符的结果均为数字,如j=7,k=student,i=j+k与i=j&k的结果均为7。当两个表达式都为空时,+运算符结果为0,而&运算符结果为Null值。 

    提示 您可以在VBE中调试,看看它们在各种情况下的区别。 比较运算符和表达式 


    ■ 比较运算符包括<(小于)、>(大于)、=(等于)、>=(大于或等于)、<=(小于或等于)、<>(不等于),用于数据元素的比较,其一般的语法为: 
        结果=表达式1 <比较运算符> 表达式2 
    结果为True(1)、False(0)或者为Null。其中比较运算符可以单独使用,也可以两两结合使用。如果表达式1或者表达式2本身为Null时才会产生Null的结果。 
    下面结合上述语法,对这些比较运算产生的结果为True或False时所需要的条件进行说明: > 表达式1大于并且不等于表达式2时,其结果为True;否则,为False。 < 表达式1小于并且不等于表达式2时,其结果为True;否则,为False。 = 表达式1等于表达式2时,其结果为True;否则,为False。 
    >= 表达式1大于或者等于表达式2时,其结果为True;否则,为False。 <= 表达式1小于或者等于表达式2时,其结果为True;否则,为False。 <> 表达式1不等于表达式2时,其结果为True;否则,为False。 
    比较运算符可用于数值比较或字符串变量比较,也可用于数值与字符串的比较。如果其中一个表达式是数值,另一个是字符串,则数值表达式总是“小于”字符串表达式;如果都是字符串,则最大的字符串就是最长的字符串;如果字符串一样长,则小写的大于大写的。 
    还有一个比较运算符,即Is运算符,可用于判断两个对象变量是否指向同一个对象,其语法为:     结果=对象1 Is 对象2 
    如果对象1和对象2都指向同一个对象,其结果为True;否则,结果为False。 

    还可以用Is运算符来判断一个对象变量是否符合要求,例如,条件判断语句If objVar Is Nothing Then 表明,如果对象变量objVar没有对象引用,则为True,执行Then后面的语句。

     

    ■ 比较运算符的优先顺序。如果多个比较运算符出现在同一行代码中,则按从左到右的顺序计算。 逻辑运算符和表达式 


    ■ 逻辑运算符允许对一个或多个表达式进行运算,并返回一个逻辑值。VBA的逻辑运算符包括:And(逻辑与)、Or(逻辑或)、Not(逻辑非)、Eqv(与或)、Imp(蕴含)、Xor(异或)。 And 执行逻辑与运算,即如果表达式1和表达式2都是True,则结果返回True;只要其中一个表达式为False,其结果就是False;如果有表达式为Null,则结果为Null。其语法为: 结果=表达式1 And 表达式2 

    例如,If x>1 And y<10 Then,表示如果x的值大于1且y的值小于10时,就执行Then后面的代码。又如,语句MsgBox ActiveSheet.Name=”Sheet2” And Range(“A1”)=1表示如果当前工作表名为Sheet2并且当前工作表上的单元格A1的值为1时,消息框将显示True。

     

    Or 执行逻辑或运算,即如果表达式1或者表达式2为True,或者表达式1和表达式2都为True,则结果为True;只有两个表达式都不是True时,其结果才为False;如果有表达式为Null,则结果也是Null。其语法为: 
        结果=表达式1 Or 表达式2 

    例如,If x>1 Or y<10 Then,表示如果x的值大于1,或者y的值小于10,则执行Then后面的代码。又如,语句MsgBox Range(“A1”)=1 Or Range(“B1”)=2表示如果当前工作表中的单元格A1中的值为1或者单元格B1中的值为2时,消息框将显示True。

     

    Not 对一个表达式进行逻辑非运算,即如果表达式为True,则Not运算符使该表达式变成False;如果表达式为False,则Not运算符使该表达式变成True;如果表达式为Null,则Not运算符的结果仍然是Null。其语法为: 
        结果=Not 表达式 
    例如,If Not IsError(x) Then,如果IsError返回False则执行Then后面的代码,表示x中不包含错误。 

    又如,语句Selection.Font.Bold=Not Selection.Font.Bold,其中Bold属性的值为True或False,使用Not运算符会将值False改为True,将值True改为False,这样可用于切换所选单元格是否“加粗”。这也是VBA程序编写时的一个技巧,我们可以运用Not运算符模仿工具栏“加粗”、“斜体”等按钮的工作模式,如当我们点击“加粗”按钮时,所选单元格中的字体将加粗显示,再次单击“加粗”按钮,单元格中的字体又正常显示了。 

    Eqv 执行与或运算,即判断两个表达式是否相等,当两个表达式都是True或者都是False时,结果返回True;若一个表达式为True而另一个表达式为False时,结果返回False。其语法为:     结果=表达式1 Eqv 表达式2 


    Imp 执行逻辑蕴含运算,其语法为:     结果=表达式1 Imp 表达式2 

    当两个表达式都为True和两个表达式都为False时,其结果为True;当表达式1为True,表达式2为False时,其结果为False;当表达式1为False,表达式2为True时,其结果为True;当表达式1为False,表达式2为Null时,其结果为True;当表达式1为True,表达式2为Null时,其结果为Null;当表达式1为Null,表达式2为True时,其结果为True;当表达式1为Null,表达式2为False时,其结果为Null;当两个表达式都为Null时,其结果为Null。上面的表述可能有点绕口,概括地说,不管表达式1,当表达式2为真时,其结果为True;当两个表达式都为False,或者表达式1为False,表达式2为Null时,其结果为True;当表达式1为True,表达式2为False时,结果为False;其它情况则为Null。

     

    Xor 执行逻辑异或运算,用于判断两个表达式是否不同。若两个表达式都是True或都是False时,其结果就是False;如果只有一个表达式是True,其结果就是True;如果两个表达式中有一个是Null,其结果是Null。其语法为: 

    结果=表达式1 Xor 表达式2 ■ 逻辑运算符的优先顺序 


    逻辑运算符的优先顺序依次为:Not——And——Or——Xor——Eqv——Imp。如果在同一行代码中多次使用相同的逻辑运算符,则从左到右进行运算。 运算符的优先顺序 
    如果您不了解运算符的优先级别(即哪个运算符优先运算,哪个运算符最后才运算),您的表达式可能会出现意想不到的结果。在前面的小节中,介绍了同一类运算符的优先顺序。如果在一行代码中包括多个运算符,则其进行运算的优先顺序是不相同的。运算符的优先级会影响到表达式的最终结果。 
    当一行代码中包括几类运算符时,其优先顺序为:算术运算符——连接运算符——比较运算符——逻辑运算符。 

    如果您要改变同类或不同类运算符的优先顺序,可以使用括号,括号内的表达式总比括号外的优先进行运算。 




    Like运算符 

    Like运算符用于判断给定的字符串是否与指定的模式相匹配,其语法为: 结果=字符串 Like 模式 

    其中,字符串为要与模式相比较的字符串,如果字符串与指定的模式相匹配,则结果为True;否则,其结果为False。如果字符串或者模式Null,则结果为Null。

     

    在模式中可使用一些特殊字符,其它的字符都能与它们相匹配,

    这些字符有:

    ?代表任意一个字符;

    *代表0或多个字符;

    #代表任意一个数字(0-9);

    [charlist]代表字符列表中的任意一个字符;

    [!charlist]代表不在字符列表中的任意一个字符;

    []代表空字符串(“”)。 

    Charlist将模式中的一组字符与字符串中的一个字符进行匹配,可以包含任何一种字符,包括数字;

    在Charlist中使用连字号(-)产生一组字符来与字符串中的一个字符相匹配,如[A-D]与字符串相应位置的A、B、C或D匹配;

    在Charlist中可以产生多组字符,如[A-D H-J];

    各组字符必须是按照排列顺序出现的;

    在Charlist的开头或结尾使用连字号(-)或以与连字号自身相匹配,例如[-H-N]与连字号(-)或H到N之间的任何字符相匹配;

    在Charlist中的一个字符或者一组字符前加上!号,表明与该字符或该组字符之外的所有字符匹配,如[!H-N]与字符H-N范围之外的所有字符匹配;

    而在[]外使用!号则只匹配其自身。

    要使用任何特殊字符作为匹配字符,只需将它放在[]中即可,例如[?]表明要与一个问号进行匹配。

    下面给出一个例子。 

    打开一个工作簿,选择菜单“工具——宏——Visual Basic编辑器”或按Alt+F11组合键,打开VBE编辑器。

    在VBE编辑器中,选择菜单“插入——用户窗体”,新建一个用户窗体,点击控件工具箱中的“文本框”控件和“按钮”控件,在用户窗体上放置一个“文本框”和一个“按钮”,并在用户窗体中对它们的大小和位置进行合理调整,双击刚创建的“按钮”控件,并输入下面的代码:

     Private Sub CommandButton1_Click()   

    Dim sEnd As String, sPattern As String   

    sEnd = "in Office" 

      sPattern = "[F W]*" & sEnd 

      If TextBox1.Text Like sPattern Then

         MsgBox "输入正确"  

     Else 

        MsgBox "输入错误"  

    End If 

    End Sub 

    本代码中[F W]*表示字符以F或W开头的字符串,使用&连接符将其与变量sEnd所代表的字符串“in Office”相连接。如果您在文本框中输入以字符F或字符W开头并以“in Office”结尾的句子,将显示“输入正确”消息框,否则将显示“输入错误”的消息框。

    在VBE编辑器中点击运行按钮或按F5键,运行该代码试试。

    当您在文本框中输入“Fanjy in Office”后,单击按钮,将显示“输入正确”消息框。




     AddressOf运算符 

    AddressOf运算符将过程的地址传递给API函数。其语法为     AddressOf 过程名 
    其中,过程名为需要传递给API函数地址的过程名称。AddressOf运算符后面必须是用户定义的函数名、过程名或属性名,且该过程或函数必须保存在代码模块中。 赋值运算符 
    在VBA中使用等号(=)作为赋值运算符,它将其右侧的数据或者表达式的结果赋给左侧的变量,使其在程序代码中运用。例如,x=666,Range(“A1”).Value=”Dog”。 点运算符 
    在VBA中,使用点运算符来引用某个对象。运用点运算符,可以限定所引用的对象的位置,清楚地表明该对象的层次结构,还可以指定某对象的方法或属性。例如,语句Workbooks(“Book1.xls”).Worksheets(“Sheet1”).Range(“A1”)表明对工作簿Book1中的工作表Sheet1上的单元格A1的引用;又如,语句Msgbox Worksheets(“Sheet1”).Range(“A1”).Value表明显示当前工作簿中工作表Sheet1上单元格A1的值。
    展开全文
  • VBA中的正则表达式

    2014-12-23 18:22:58
    VBA中的正则表达式,正则表达式的基本知识讲解!
  • VBA基础知识整理(正则表达式

    千次阅读 2019-05-13 19:21:12
    '一 正则表达式 '正则表达式是处理字符串的外部工具,它可以根据设置的字符串对比规则,进行字符串的对比、替换等操作。 '正则表达式的作用: '1、完成复杂的字符串判断 '2、在字符串判断时,可以最大...

    '一 正则表达式

       '正则表达式是处理字符串的外部工具,它可以根据设置的字符串对比规则,进行字符串的对比、替换等操作。
       
       '正则表达式的作用:
         '1、完成复杂的字符串判断
         '2、在字符串判断时,可以最大限度的避开循环,从而达到提高运行效率的目的。
    

    '二 使用方法

    '1、引用法

       '点击VBE编辑器菜单:工具 - 引用,选取: Microsoft VBScript Regular Expressions 5.5,引用后在程序开始进行如下声明
         'Dim regex As New RegExp
         Sub t1()
           Dim reg As New RegExp
         End Sub
    

    '2、直接建法

    '     Dim regex As Object
    '     Set regex = CreateObject("VBScript.RegExp") '创建正则对象
    
         Sub t2()
           Dim reg As Object
           Set reg = CreateObject("VBScript.RegExp")
         End Sub
    

    三 常用属性

    '1 Global属性:

           '如果值为true,则搜索全部字符
           '如果值为False,则搜索到第1个即停止
           '1 例:
           Sub t3()
                 Dim reg As New RegExp
                 Dim sr
                 sr = "ABCEA"
                 With reg
                   .Global = True
                   .Pattern = "A"
                   Debug.Print .Replace(sr, "")
                 End With
           End Sub
    

    '2 IgnoreCase 属性
    '如果搜索是区分大小写的,为False(缺省值)True不分

    '3 Pattern 属性
    ’ 一个字符串,用来定义正则表达式。缺省值为空文本。
    '4 Multiline 属性,字符串是不是使用了多行,如果是多行,$适用于每一行的最后一个

           Sub t4()
             Dim reg As New RegExp
             Dim sr
             sr = "AEA" & Chr(10) & "ABCA"
             With reg
               .Global = True
               .MultiLine = True
               '.Pattern = "A$"
               .Pattern = "^A"
               Debug.Print .Replace(sr, "")
             End With
           End Sub
    

    '5 Execute 方法

             '返回一个 MatchCollection 对象,该对象包含每个成功匹配的 Match 对象,
             '返回的信息包括:
               'FirstIndex:开始位置
               'Length; 长度
               'Value:长度
           Sub t5()
                 Dim reg As New RegExp
                 Dim sr, matc
                 sr = "A454BCEA5"
                 
                 With reg
                   .Global = True
                   .Pattern = "A\d+"
                   Set matc = .Execute(sr)
                 End With
                 
                 Stop
           End Sub
         
           Function ns(rg)
                 Dim reg As New RegExp
                 Dim sr, ma, s, m, x
                 
                 With reg
                   .Global = True
                   .Pattern = "\d*\.?\d*"
                   Set ma = .Execute(rg)
                 
                   For Each m In ma
                      s = s + Val(m)
                   Next m
                   
                 End With
                 
                ns = s
               ' Stop
           End Function
    

    '6、Text方法

            '返回一个布尔值,该值指示正则表达式是否与字符串成功匹配。其实就是判断两个字符串是否匹配成功
            Sub t7()
                 Dim reg As New RegExp
                 Dim sr
                 sr = "BCR6EA"
                 
                 With reg
                   .Global = True
                   .Pattern = "\d+"
                   If .test(sr) Then MsgBox "字符串中含有数字"
                 End With
                 
            End Sub
            ----------------------------------------------------
    
    
    Function 提取中文(rg As String, k As Integer)
    
          Dim regx As New RegExp
          With regx
    	       .Global = True
    	       If k = 1 Then
    	       		.Pattern = "\D"
    	       ElseIf k = 2 Then
    	       		.Pattern = "\w"
    	       End If
    	       
    	       提取中文 = .Replace(rg, "")
          End With
    
    End Function
    

    常用符号

    '正则表达式的核心是设置对比的规则,也就是设置Pattern属性,而组成这些规则除了字符本身以外,是具有特定含义的符号。
    '下面介绍的是正规表达式中常用符号的第一部分。

    '\号

    '1.放在不便书写的字符前面,如换行符(\r),回车符(\n),制表符(\t),\自身(\)

    '2.放在有特殊意义字符的前面,表示它自身,"$","^","."

    '3.放在可以匹配多个字符的前面

           '\d 0~9的数字
           '\w 任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个
           '\s 包括空格、制表符、换页符等空白字符的其中任意一个
           
           '以上改为大写时,为相反的意思,如\D 表示非数字类型
           
            Sub t1()
               Dim regx As New RegExp
               Dim sr
               sr = "AE45B646C"
               
               With regx
                 .Global = True
                 .Pattern = "\d" '排除非数字
                 Debug.Print .Replace(sr, "")
               End With
               
            End Sub
    

    '.(点)

       '可以匹配除换行符以外的所有字符
    

    '+号
    '+表示一个字符可以有任意多个重复的。

       Sub t11()
         Dim regx As New RegExp
         Dim sr
         sr = "A234CA7A"
         With regx
          .Global = True
          .Pattern = "A\d+"
          Debug.Print .Replace(sr, "")
         End With
         
       End Sub
    

    '{}号
    '可以设置重复次数

        '1 {n} 重复n次
            Sub t16()
               Dim regx As New RegExp
               Dim sr
               sr = "A234CA7A67"
               
               With regx
                .Global = True
                .Pattern = "\d{5}" '连续两个数字
                Debug.Print .Replace(sr, "")
               End With
               
             End Sub
             ---------------------------------------------------
       '2  {m,n}最小重复m次,最多重复n次
         
            Sub t22()
               Dim regx As New RegExp
               Dim sr
               sr = "A234CA7A6789"
               With regx
                .Global = True
                .Pattern = "\d{4,5}" '连续两个数字或连续三个数字
                Debug.Print .Replace(sr, "")
               End With
             End Sub
             ------------------------------------------------------------
        '3 {m,} 最少重复m次,相当于+
             Sub t23()
               Dim regx As New RegExp
               Dim sr
               sr = "A2348t6CA7A67"
               
               With regx
                .Global = True
                .Pattern = "\d{2,}" '连续两个数字或连续三个数字
                Debug.Print .Replace(sr, "")
               End With
               
             End Sub
    

    '* 可以出现0等任意次 相当于 {0,},比如:"^*b"可以匹配 “b”,"^^^b"…

    ’ ?
    '1 匹配表达式0次或者1次,相当于 {0,1},比如:"a[cd]?"可以匹配 “a”,“ac”,“ad”

            Sub t24()
               Dim regx As New RegExp
               Dim sr
               sr = "A23.48CA7A6..7"
               With regx
                .Global = True
                .Pattern = "\d+\.?\d+" '最多连续1个
                Debug.Print .Replace(sr, "")
               End With
             End Sub
             ----------------------------------------------------
    

    '2 利用+?的格式可以分段匹配

          Sub t87()
            Dim regex As New RegExp
            Dim sr, mat, m
            sr = "<td><p>aa</p></td> <td><p>bb</p></td>"
            
            With regex
              .Global = True
              .Pattern = "<td>.*?</td>"
              Set mat = .Execute(sr)
             
              For Each m In mat
                Debug.Print m
              Next m
              
            End With
            
          End Sub
          --------------------------------------------------------
         Sub t88()
                  
            Dim regex As New RegExp
            Dim sr, mat, m
            sr = " aba  aca  ada "
            With regex
            
              .Global = True
              .Pattern = "\s.+?\s"
              Set mat = .Execute(sr)
             
              For Each m In mat
                Debug.Print m
              Next m
              
            End With
    
         End Sub
    

    '符号:限制的字符在最前面,如\d表示以数字开头

    Sub T34()
        Dim regex As New RegExp
        Dim sr, mat, m
        sr = "d234我345d43"
        With regex
          .Global = True
          .Pattern = "^\d*"
           Set mat = .Execute(sr)
            
            For Each m In mat
              Debug.Print m
            Next m
            
        End With
      End Sub
    

    '$符号:限制的字符在最后面,如 A$表示最后一个字符是A

    Sub T3433()
        Dim regex As New RegExp
        Dim sr, mat, m
        sr = "R243r"
        
        With regex
           .Global = True
           .Pattern = "^\D.*\D$"
            Set mat = .Execute(sr)
            
            For Each m In mat
              Debug.Print m
            Next m
            
        End With
        
      End Sub
    

    '\b
    '空格(包含开头和结尾)

        Sub t26()
           Dim regx As New RegExp
           Dim sr
           sr = "A12dA56 A4"
           
           With regx
            .Global = True
            .Pattern = "\bA\d+"
            Debug.Print .Replace(sr, "")
           End With
           
        End Sub
      --------------------------------------------------
    Sub T272()
        Dim regex As New RegExp
        Dim sr, mat, m
        sr = "ad bf cr de ee"
        With regex
          .Global = True
           .Pattern = ".+?\b"
            Set mat = .Execute(sr)
            For Each m In mat
              If m <> " " Then Debug.Print m
            Next m
        End With
      End Sub
    

    '|
    '可以设置两个条件,匹配左边或右边的

      Sub t27()
           Dim regx As New RegExp
           Dim sr
           sr = "A12DA56 A4B34D"
           
           With regx
            .Global = True
            .Pattern = "A\d+|B\d+"
            Debug.Print .Replace(sr, "")
           End With
           
        End Sub
    

    '\un 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。
    '汉字一的编码是4e00,最后一个代码是9fa5

     Sub t2722()
           Dim regx As New RegExp
           Dim sr
           sr = "A12d我A爱56你 A4"
           
           With regx
            .Global = True
            .Pattern = "[\u4e00-\u9fa5]"
            Debug.Print .Replace(sr, "")
           End With
           
        End Sub
    

    '()
    '可以让括号内作为一个整体产生重复

        Sub t29()
           Dim regx As New RegExp
           Dim sr
           sr = "A3A3QA3A37BDFE87A8"
           With regx
            .Global = True
            .Pattern = "((A3){2})" '相当于A3A3
            Debug.Print .Replace(sr, "")
           End With
           
        End Sub
    

    '取匹配结果的时候,括号中的表达式可以用 \数字引用

        Sub t30()
           Dim regx As New RegExp
           Dim sr
           sr = "A3A3QA3A37BDFE87A8"
           With regx
            .Global = True
            .Pattern = "((A3){2})Q\1"
            Debug.Print .Replace(sr, "")
           End With
           
        End Sub
        -----------------------------------------
        Sub t31()
           Dim regx As New RegExp
           Dim sr
           sr = "A3A3B4B4QB4B47BDFE87A8"
           
           With regx
            .Global = True
            .Pattern = "((A3){2})((B4){2})Q\4"
            Debug.Print .Replace(sr, "")
           End With
           
        End Sub
    

    '用(?=字符)可以先进行预测查找,到一个匹配项后,将在匹配文本之前开始搜索下一个匹配项。 不会保存匹配项以备将来之用。

     '例:截取某个字符之前的数据
          Sub t343()
            Dim regex As New RegExp
            Dim sr, mat, m
            sr = "100元8000元57元"
            
            With regex
               .Global = True
               .Pattern = "\d+(?=元)" '查找任意多数字后的元,查找到后从元以前开始查找(因为元前的数字已被使用,
                                      '所以只能从元开始查找)匹配 ()后面的,因为后面没有设置,所以只显示前面的数字,元不再显示
                Set mat = .Execute(sr)
                
                For Each m In mat
                  Debug.Print m
                Next m
                
            End With
          End Sub
          -----------------------------------------
       '例:验证密码,条件是4-8位,必须包含一个数字
          Sub t355()
            Dim regex As New RegExp
            Dim sr, mat, m
            sr = "A8ayaa"
            With regex
              .Global = True
               .Pattern = "^(?=.*\d).{4,8}$"
                Set mat = .Execute(sr)
                For Each m In mat
                  Debug.Print m
                Next m
            End With
          End Sub
    

    '用(?!字符)可以先进行负预测查找,到一个匹配项后,将在匹配文本之前开始搜索下一个匹配项。 不会保存匹配项以备将来之用。

    Sub t356()
        Dim regex As New RegExp
        Dim sr, mat, m
        sr = "中国建筑集团公司"
        
        With regex
          .Global = True
           .Pattern = "^(?!中国).*"
            Set mat = .Execute(sr)
            
            For Each m In mat
              Debug.Print m
            Next m
            
        End With
    End Sub
    

    '()与|一起使用可以表示or

      Sub t344()
        Dim regex As New RegExp
        Dim sr, mat, m
        sr = "100元800块7元"
        With regex
          .Global = True
           .Pattern = "\d+(元|块)"
           '.Pattern = "\d+(?=元|块)"
            Set mat = .Execute(sr)
            For Each m In mat
              Debug.Print m
            Next m
        End With
      End Sub
    

    '[]
    '使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。用 [^ ] 不包含一系列字符,
    '则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个

    '1 和括号内的其中一个匹配

     Sub t29()
           Dim regx As New RegExp
           Dim sr
           sr = "ABDC"
           
           With regx
                .Global = True
                .Pattern = "[BC]"
                Debug.Print .Replace(sr, "")
           End With
           
    End Sub
    

    '2 非括号内的字符

        Sub T35()
           Dim regx As New RegExp
           Dim sr
           sr = "ABCDBDC"
           
           With regx
                .Global = True
                .Pattern = "[^BC]"
                Debug.Print .Replace(sr, "")
           End With
           
        End Sub
    

    '3 在一个区间

    Sub t38()
           Dim regx As New RegExp
           Dim sr
           sr = "ABCDGWDFUFE"
           With regx
            .Global = True
            .Pattern = "[a-h]"
            Debug.Print .Replace(sr, "")
           End With
           
    End Sub
    ----------------------------------------------
     Sub t40()
           Dim regx As New RegExp
           Dim sr
           sr = "124325436789"
           
           With regx
                .Global = True
                .Pattern = "[1-47-9]"
                Debug.Print .Replace(sr, "")
           End With
           
    End Sub
    
    展开全文
  • VBA正则表达式深度解析

    千次阅读 2020-06-26 18:07:14
    先上代码: Function GetStr(ByVal rng As ... '第三个参数i 为正则表达式成功匹配的结果列表中的第几个,从0开始,默认为0即第1个 '第四个参数s 为文本[True]或数字[False],用于剔除数字中的文本内容,默认...

    目录

    本文章可以学到:

    先上代码:

     分析:

    调式:

    细心一点会发现两个问题:

     一个一个的来解答


    本文章可以学到:

    • VBA正则表达式匹配第N个结果
    • VBA正则表达式剔除匹配包含字符的数字中剔除字符,只保留数字

    先上代码:

    Function GetStr(ByVal rng As String, str As String, Optional i As Long, Optional s As Boolean)
        '第一个参数rng    为数据源
        '第二个参数str    为正则表达式
        '第三个参数i      为正则表达式成功匹配的结果列表中的第几个,从0开始,默认为0即第1个
        '第四个参数s      为文本[True]或数字[False],用于剔除数字中的文本内容,默认为数字[False]
    
        If IsMissing(i) Then i = 0
        If IsMissing(s) Then s = False
    
        Dim iRg As Object
    
        Set iRg = CreateObject("VBscript.regexp")
        With iRg
            .Global = True
            .Pattern = str   '表达式,直接从用户函数的第二个参数中调用
    
            If .Execute(rng).Count = 0 Then
                '如果匹配到结果的量为0则
                GetStr = ""
                '返回结果为空值
                '函数结束
            Else
    
                If IsNumeric(.Execute(rng)(i)) Or s Then
                '如果第一次得到的结果是数字或者函数的第4个参数为True或非0则
                    GetStr = .Execute(rng)(i)
                    '直接返回第一次得到的结果
                    '函数结束
                Else
                    GetStr = GetStr(.Execute(rng)(i), "[0-9]+[.]{0,1}[0-9]{0,}")
                    '否则从第一次返回的结果中剔除数字以外的字符
                    '即调用函数本身再传入一个数字的正则表达式"[0-9]+[.]{0,1}[0-9]{0,}"
                End If
            End If
        End With
    End Function

     

     测试结果:

     BCDEF
    2源文本.1ss11.11cmcxzas/.'22.22cmwq.,3cmd.,/;eq4.44444cm
    3正则表达式.1[0-9]+[.]{0,}[0-9]{0,}[cm]
    4                第3参数(i)
    第4参数(s)     
    0123
    5
    6011.11   =GetStr(C2,C3,C4,B6)22.22  =GetStr(C2,C3,D4,B6)3  =GetStr(C2,C3,E4,B6)4.44444  =GetStr(C2,C3,F4,B6)
    7111.11c  =GetStr(C2,C3,C4,B7)22.22c =GetStr(C2,C3,D4,B7)3c =GetStr(C2,C3,E4,B7)4.44444c =GetStr(C2,C3,F4,B7)
    8     
    9源文本.2ss11.11cmcmxzas/.'22.22cmwq.,333333cmd.,/;eq4.44444cm
    10正则表达式.2[0-9]+[.]{0,}[0-9]{0,}[cm]+
    11                第3参数(i)
    第4参数(s)     
    0123
    12
    13011.11      =GetStr(C9,C10,C11,B13)22.22    =GetStr(C9,C10,D11,B13)333333   =GetStr(C9,C10,E11,B13)333333cm  =GetStr(C9,C10,E11,B14)
    14111.11cmcm  =GetStr(C9,C10,C11,B14)22.22cm  =GetStr(C9,C10,D11,B14)333333cm =GetStr(C9,C10,E11,B14)4.44444cm =GetStr(C9,C10,F11,B14)

     分析:

    我们从[C6]单元格开始说起

    代入目标单元格解析的公式是:

    =GetStr("ss11.11cmcxzas/.'22.22cmwq.,3cmd.,/;eq4.44444cm","[0-9]+[.]{0,}[0-9]{0,}[cm]",0,0)

     

    调式:

    在第17行代码添加断点,然后在监视窗口中添加监视:

    irg.Execute(Rng)

    双击[C6]单元格,回车就可以看到如下图所示

    可以看到这个 "[0-9]+[.]{0,}[0-9]{0,}[cm]正则表达式作用在这段"ss11.11cmcxzas/.'22.22cmwq.,3cmd.,/;eq4.44444cm"文字中,会得到4个结果,那么就可以通过传入第3个参数  i   来选择我们想要的第几个结果。

    在[C6]单元格中我们第三个参数是0,也是就返回匹配到的第0个结果,11.11c

     

    细心一点会发现两个问题:

    1. 传入的正则表达式是 "[0-9]+[.]{0,}[0-9]{0,}[cm]",末尾是 cm 为啥只匹配到了c
    2. 【C6】单元格的结果是11.11
       

     

     一个一个的来解答

    第1个问题是因为[cm]默认只匹配中括号中的第一个符号,也就是c,如果想要匹配[cm]有几种方法

    • 笨方法:[c][m]或者[cm]{2}或者[cm]{0,}
    • 好方法:[cm]+或者cm

     第2个问题是因为一般匹配的数字的时候,数字后面可能会有一些特定字符比如单位。而匹配的结果会把这些字符一起放进去,这样就不方便使用公式进行计算或者统计总数,需要二次匹配,也就是在得到一个包含字符的数字中剔除字符,只保留数字。

    关键就在24-33行代码:

                If IsNumeric(.Execute(rng)(i)) Or s Then
                '如果第一次得到的结果是数字或者函数的第4个参数为True或非0则
                    GetStr = .Execute(rng)(i)
                    '直接返回第一次得到的结果
                Else
                    GetStr = GetStr(.Execute(rng)(i), "[0-9]+[.]{0,1}[0-9]{0,}")
                    '否则从第一次返回的结果中剔除数字以外的字符
                    '即调用函数本身再传入一个数字的正则表达式"[0-9]+[.]{0,1}[0-9]{0,}"
                End If

    根据这个思路看测试结果,就很清晰明了了。

    看不明白的话把代码放在EXCEL模块里面多测试并调式就会明白了,有不明白的欢迎交流。

    展开全文
  • VBA运算符使用

    2018-11-02 14:27:41
    1、“&”是强制性连接,就是不管什么都连接。 2、“+”是对字符串进行连接,对数字则进行加法运算。(用“+”号的时候,“+”前后类型要一致)
  • vba正则表达式

    2018-11-28 17:24:46
    vba正则表达式学习文档,涵盖详细的正则语法说明、有具体的功能例子,可做文档查询或实例参考。
  • excel vba 公式提取 转换成数学表达式
  • vba正则表达式基础

    2014-12-23 18:24:28
    vba正则表达式基础知识介绍,由浅入深,实例讲解
  • VBA之正则表达式(1)-- 基础篇

    万次阅读 多人点赞 2019-03-03 15:06:26
    VBA中并没有直接提供正文表达式对象,需要借助VBScript的正则对象。如果使用前期绑定,那么就需要在VBE中引用如下扩展库。 使用如下代码可以利用后期绑定的方式创建正则对象。 Set objRegEx = CreateObject(&amp...
  • 这个需要也并不复杂,用VBA代码逐个判断字符和其前后的字符集可以区分每组,高手可以写出递归调用过程。我们还是来看一下正则如何处理这种问题。 Sub RegExpDemo() Dim strTxt As String Dim objRegEx As Object, ...
  • 正则表达式中的元字符特殊字符重复字符字符集通配符其它字符运算符优先级  正则表达式由若干个 分支 构成,分支之间用符号 | 相连。从逻辑上讲,分支之间是一种“或”的关系,一个字符串只要与正则表达式中的任何一...
  • EXCEL VBA 正则表达式

    万次阅读 2017-07-06 16:15:09
     正则表达式是通用的文本搜索和处理方案,它的知识不是VBA独有的,基本上每种语言都内置了正则表达式的功能。正则表达式的基础知识不是这里的重点,需要的朋友可以Google一下,或者参看下面的一些入门教程: ...
  • VBA 正则表达式

    2019-02-26 09:40:41
    文档涵盖了VBA中正则表达式的使用,以及一些实例案件,可以由浅入深的讲解VBA 中正则表达式的实现
  • VBA-正则表达式

    千次阅读 2018-07-19 19:37:23
    1.写好正则表达式,在数据截取处理中是十分有优势的,以下举几个例子来学习一下正则表达式的用法 Option Explicit Public Function getnum2(str As String) With CreateObject("VBScript.RegExp") ....
  • 正则表达在文字处理非常好用,可以进行复杂的字符串筛选判断,用于各种输入校验,字符串查找、替换,以及提取操作。
  • 在EXCEL表内遇到有规律性的数据需要提取或者替换时,比如在数据中提取时间,身份证号码等,EXCEL内自带的查找替换就难以实现,我们可以利用VBA适用正则表达式去对数据进行匹配。 什么是正则表达式? 正则表达式,...
  • 如何在VBA中使用正则表达式

    千次阅读 2019-05-26 11:56:56
    VBA中的正则表达式应用  在VBA中使用正则表达式,可以通过下列途径实现: 创建正则表达式对象: 前期绑定: 在VBA代码编辑器中的"Tools"菜单中,选中"References…",然后引用Microsoft VBScript Regular ...
  • Excel-VBA正则表达式提取文本案例

    千次阅读 2019-10-02 23:47:44
    然而之前没学VBA里的正则表达式语法,因此就去网上搜了一下,结果发现根本不能运行。几经辗转,总算搞定,因此总结一下,供后来者参考。  有几点说明:  1、我是先在 Python中验证了正则表达式再copy到VBA中应用...
  • vba 正则表达式

    2013-01-08 22:58:33
    正则表达式基础说明, 供初学者参考,大婶绕过
  • VBA 正则表达式 资料整理创建正则表达式1. 前期引用2. 后期引用正则表达式的属性与方法示例 创建正则表达式 正则表达式(Regular Expression),常被用来检验、替换符合某个模式(规则)的字符串,在代码中常缩写为 ...
  • VBA正则表达式在Excel中使用,希望能给大家有所帮助,还有其他相关EXCEL资源,需要有的可以联系我. 谢谢.
  • VBA之正则表达式(5)-- 中文字符

    千次阅读 2019-03-10 11:07:46
    相关博文链接: VBA之正则表达式(1)-- 基础篇 VBA之正则表达式(2)-- 批量修改公式 VBA之正则表达式(3)-- 特殊公式计算 VBA之正则表达式(4)-- 提取日期和金额 VBA之正则表达式(5)-- 中文字符 VBA之正则...
  • =path & sh.Name & ".csv" Next End Sub 三、利用正则表达式进行定向提取 正则表达式之前没有提到过,VBA启用的话现在请记得在VBE——工具——引用中添加 Microsoft VBScript Regular Expressions 5.5: 再认识一下...
  • 使用VBA字符串函数去逐个字符判别的方式,对于B4的内容处理起来就比较麻烦,当然肯定是可以实现的。使用正则来实现就会更简洁。 Sub RegExpDemo85() Dim strTxt As String Dim objRegEx As Object ...
  • VBA之正则表达式(13)-- 字符串变换

    千次阅读 2019-06-01 12:05:21
    实际应用场景中,字符串可能是完全不规则的,就需要使用VBA的字符串函数逐个读取字符,并进行判断,提取数字之后,进行运算,然后再拼接字符串也可以实现,有些麻烦。 处理字符的任务,还是需要使用正则这个神器。
  • 网上测试了很多,大多数都不满意。于是自己编写了一个。VBA利用通配符或正则表达式删除Word中选中部分的多余空行,支持把手动换行符替换为段落标记处理。
  • (\[|$))" .ignoreCase = True strWord = .Replace(strWord, "3") Debug.Print strWord End With Set objRegExp = Nothing End Sub 【代码解析】 第4行代码创建正则表达式对象。 第5行代码设置初始字符串变量。 第8行...
  • 西装,皮带,领带各10 西装皮带领带各60 西装,皮带,领带各50 上衣、领带各30 西装皮带领带各20 皮带领带各10 【代码解析】 第4行代码创建正则表达式对象。 第5行代码设置初始字符串变量。 第8行代码设置匹配模式...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,013
精华内容 1,605
关键字:

vba的表达式