【20181130】

您所在的位置:网站首页 正则表达式11位数字 【20181130】

【20181130】

#【20181130】| 来源: 网络整理| 查看: 265

本文转载自公众号: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