ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: liu-aguang

[原创] 正则表达式入门与提高---VBA平台的正则学习参考资料

    [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-10 23:42 | 显示全部楼层
本帖已被收录到知识树中,索引项:文本处理和正则
本帖最后由 liu-aguang 于 2014-6-12 08:13 编辑

(三)用正则处理文本的一个例子
     我们已经认识了几个简单的元字符(序列),并能用它们构建一些实用的正则表达式,那么,怎样把它们应用于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语句,此时不是必须的,只是为了说明属性的应用.

评分

6

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-10 23:21 | 显示全部楼层
本帖最后由 liu-aguang 于 2014-6-16 19:17 编辑

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


下面列举了VBA中正则表示字符的所有元字符(序列),在以后的章节中会详细介绍.
(1)  常用不可打印字符:\n、\t、\f、\r、\v
(2)  八进制转义:\num    (num是一个八进制数)
(3)  十六进制转义:\xnum (num是一个十六进制数)
(4)  Unicode转义:\unum  (num是unicode代码点)
(5)  控制字符:\cchar       (char是A-Z之间的任意字母)
(6)  普通字符组:[a-z]和[^a-z]
(7)  几乎能匹配任何字符的元字符:英文句点
(8)  字符组缩略表示法:\w、\d、\s、\W、\D、\S

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

3.表示位置的元字符(序列)^$\b\B(?=…)(?!...)例:
捕获8.PNG
4.在正则表达式中起分组、捕获和控制作用的元字符(序列)
(…)(?:…)\1…|…|…*?+???{num,num}?
:

捕获9.PNG
捕获.PNG

评分

13

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-10 23:19 | 显示全部楼层
本帖最后由 liu-aguang 于 2014-6-11 22:26 编辑


第一篇 基础篇

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

      文本处理是一项常见的工作任务,比如:在一段文本或数据中,查找、替换、提取、验证、分离和删除等特定字符或字符串。在几乎所有文本编辑器中(如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函数的参数里有更多的特殊字符或结构,用来描述字符或字符串模式.不过,正则表达式里,那些特殊字符更多,语法规则更丰富,可以认为,它相当于是一门微型语言.
       接下来,本章会把所有的元字符(序列)分类展示给你,不是要你立马记住或掌握它,目的是让你有个概貌,避免在以后的学习中迷失方向.


评分

18

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 14:54 , Processed in 0.033123 second(s), 5 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表