【20181130】 |
您所在的位置:网站首页 › 正则表达式11位数字 › 【20181130】 |
本文转载自公众号:SUT事务所,作者:党药中,感谢作者辛勤劳动和无私分亨! 大家好,我是中药党。
上次我们分享了在Excel中结合Word的通配符功能,完成一些文本的提取、格式的更改等功能,虽然这样也能曲线救国达到一些效果,但是总是要借助Word的帮助,即使这个Word也是Office大家族的一员,但总感觉有那么一点不方便。
今天我们介绍一下ExcelVBA中的RegExp对象,使用正则表达式完成类似功能的方法,比如我先用Steven老师在VBA训练营中的一个例子,在A列人员信息中提取出人员的联系方式填到B列。如下图: 这个题目是构造了个函数GetPhone,在B1中写公式“=GetPhone(A1)”,并拖动单元格填充完成的,我先把该函数的VBA代码粘出来,如下图: Function GetPhone(rng As Range)With CreateObject('VBscript.regexp') .Global = True .Pattern = '\d{8,11}' If .Execute(rng).Count = 0 Then GetPhone = '' Else GetPhone = .Execute(rng)(0) End If End With End Function 下边解释一下代码的含义: 1.首先定义一个函数。 用于提取电话号码(也就是工作表中的公式),函数名设一个有意义的GetPhone,函数设置一个参数,参数类型为Range。 2.定义一个RegExp变量。 RegExp也不是VBA内置的类型,同样也是Windows脚本语言中的一个很有用的对象。 之前我们在介绍定义字典的时候说过前期绑定和后期绑定的区别,定义正则表达式变量同样可以使用前期绑定和后期绑定的方法。 前期绑定方法是在VBE编辑器菜单,选择“工具”→“引用”,选取Microsoft VBScript Regular Expressions 5.5,然后,就可以在代码中直接用Dim定义使用。 后期绑定的方法是直接在代码中使用CreateObject函数创建并返回一个对 ActiveX 对象的引用。 前期绑定的优点是可以有编辑器的Intellisense支持,即在使用变量的时候可以有代码提示,适合不熟悉属性和方法的初学者,缺点就是不便于移植,换一台计算机运行代码之前必须要添加相关的代码引用。 后期绑定的优点就是方便移植,换计算机运行之前不用添加引用,缺点就是没有代码提示,不便于初学者使用。
本例使用后期绑定的方式定义一个正则表达式变量,如下图: 3.RegExp对象的属性 Global:设置或返回一个Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。如果搜索应用于整个字符串,Global属性的值应该为 True,否则其值为 False。默认的设置为True。 IgnoreCase:设置或返回一个Boolean值,指明模式搜索是否区分大小写。如果搜索是区分大小写的,则 IgnoreCase 属性应该为False;否则应该设为True。缺省值为True。 Pattern:设置或返回被搜索的正则表达式模式。 被搜索的正则字符串表达式。它包含各种正则表达式字符。 本例设置的Pattern表达式为\d{8,11},\d表示的是数字,是[0-9]的简化表达式,{8,11}表示的是此正则正好出现8次到11次。因为我们提取的是联系方式,为了简化规则,我们定联系方式最短是8位,最长是11位。 Multiline:设置或返回一个Boolean值,指定搜索字符串是否分布在多行,如果在控件中使用多行文本框的话,则需要使用这个属性。缺省值为False。
4. RegExp对象的方法 Execute:对指定的字符串执行正则表达式搜索。需要传入要在其上执行正则表达式的文本字符串。正则表达式搜索的设计模式是通过 RegExp对象的Pattern来设置的。Execute方法返回一个Matches集合,其中包含了在string中找到的每一个匹配的Match对象。如果未找到匹配,Execute将返回空的Matches集合。 MatchCollection对象只有两个只读属性,Count和Item Count:匹配到的对象的数目 Item:集合的通用方法,需要传入Index值获取指定的元素。 本处的意思就是,用正则匹配函数传入的参数,如果没有找到符合正则匹配的(集合内元素个数为0),则函数返回值GetPhone为空,如果集合内元素不为0,则取集合的第一个元素。
保存之后就可以在工作表界面使用GetPhone函数了,如下图: 这样就得到了复杂文本中的联系方式。为了知识的完整性和系统性,下面把涉及RegExp对象的属性和方法也一并介绍完。
Replace方法:替换在正则表达式查找中找到的文本。如下图: Test方法:对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。RegExp.Global属性对Test方法没有影响。如果找到了匹配的模式,Test方法返回True;否则返回False。 MatchCollection集合对象中的元素类型是Match,Match对象有以下几个只读的属性: FirstIndex :匹配字符串在整个字符串中的位置,值从0开始。 Length: 匹配字符串的长度。 Value: 匹配的字符串。 SubMatches: 集合,匹配字符串中每个分组的值。作为集合类型,有Count和Item两个属性。 最后,关于正则表达式,最难的还是写出符合场景需要的正则,我把常用的规则列出来,供初学的小伙伴们参考: (1)单个字符: \\:表示转义字符“\”; \t:表示一个“\t”符号; \n:匹配换行(\n)符号; (2)字符集: [abc]:表示可能是字符a、字符b、字符c中的任意一位; [^abc]:表示不是字符a、b、c中的任意一位; [a-z]:所有的小写字母; [a-zA-Z]:表示所有的字母; [0-9]:表示任意的一位数字; [一-龥]:表示任意的一个汉字; (3)简化的字符集表达式: .:一个点,表示任意的一位字符; \d:等价于“[0-9]”,属于简化写法; \D:等价于“[^0-9]”,属于简化写法; \s:表示任意的空白字符,例如:“\t”“\n” \S:表示任意的非空白字符; \w:等价于“[a-zA-Z_0-9]”,表示由任意的字母、数字、下划线组成; \W:等价于“[^a-zA-Z_0-9]”,表示不是由任意的字母、数字、下划线组成; (4)边界匹配 ^:正则的开始; $:正则的结束; (5)数量表达 正则?:表示此正则可以出现0次或1次,例如\d?,表示出现0次或1次数字; 正则 :表示此正则可以出现1次或1次以上; 正则*:表示此正则可以出现0次、1次或多次; 正则{n}:表示此正则正好出现n次; 正则{n,}:表示此正则出现n次以上; 正则{n,m}:表示此正则出现n~m次; (6)逻辑运算 正则1正则2:正则1判断完成后继续判断正则2; 正则1|正则2:正则1或者正则2有一组满足即可;
最后,列几个常见的正则表达式: 1)匹配邮编,邮编是6位数字。正则表达式:\d{6} 2)匹配手机,手机号是11位数字。正则表达式:\d{11} 3)匹配电话,电话是区号-号码组成,区号有3到4位,号码有6到9位。正则表达式:\d{3,4}-\d{6,9} 4)匹配日期,日期格式如1992-5-30,明显数字加横线组成。正则表达式:\d{4}-\d{1,2}-\d{1,2} 5)匹配电子邮箱,有需要的话建议大家百度一下
今天分享的内容有点多,主要希望小伙伴们在处理字符串的时候可以多想到正则表达式,有使用正则简化代码的意识,至于写正则表达式的知识点,用的时候再查询也来得及,这也是个熟能生巧的活。小伙伴有兴趣的话,也可以自己写一些工作中常见处理字符串的正则表达式,不确定是否正确的话可以在网上用在线正则表达式测试工具验证。今天的分享就到这里了,欢迎小伙伴讨论学习。 猜您喜欢 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |