正则表达式很强大且内容比较多。不少初学者学这个表示很困难。故写一篇入门的教程。

1、什么是正则表达式

正则表达式是一个天才创建的用于快速检索匹配字符串,通过简单的表达式匹配文本。

2、正则表达式的组成

正则表达式也是一个字符串,包括元字符、限定符和正常意义的字符。正则表达式强大的地方就在元字符和限定符。

3、限定符

很多人讲这个都是先讲元字符。其实先讲限定符更加容易吸收。限定符是表示前面字符或元字符出现的次数。主要限定符如下:

限定符 含义
* 表示前面字符或元字符出现0次或多次。例如:zo*m,可以匹配zm,zom,zoom
+ 表示前面字符或元字符出现1次或多次。例如:zo+m,可以匹配zom,zoom
表示前面字符或元字符出现0次或1次。例如:zo?m,可以匹配zm,zom
{n} 表示前面字符或元字符出现n次。例如:zo{3}m,可以匹配zooom
{n,m} 表示前面字符或元字符出现n到m次。例如:zo{1,3}m,可以匹配zom,zoom,zooom
{n,} 表示前面字符或元字符至少出现n次。例如:zo{2,}m,可以匹配zoom,zooom等等

当然,限定符用法不止这些。正则表达式还有个规则叫贪婪与吝啬。有些人也叫贪婪与懒惰。这个“贪婪与吝啬”是正则表达式难点和重点之一。

例如,字符串“n123n456n789n”。那么我们怎么匹配获取“n123n”和“n123n456n789n”呢。

使用正则表达式,首先要找规律。很明显我们要获取的内容开头和结尾都有一个字母n,中间是数字或字母。我们先学一个元字符。元字符是可以代表一定含义或规律的字符。可以匹配除了换行符之外的任意字符是小数点。

那么我们的表达式可以这么写:n.+n

两个字母n,中间夹着1个或多个任意字符。

但这样只能匹配得到一个结果:n123n456n789n。在我们没有对其任何限制的情况下,正则表达式会尽可能多匹配符合条件的结果。从头到尾整个都符合,所以都匹配了。这个称之为贪婪匹配。

那如何做到尽可能少的匹配。这个就需要加个?进行限制。

例如,表达式:n.+?n

这个表达式尽可能少匹配,也就是说碰到一次符合条件的就立马返回结果。结果可以匹配到“n123n”、“n789n”。

这种规则叫做吝啬匹配。只要在限定符后面再加个问号即可。

4、元字符

元字符是用于匹配字符串,可以代表一定含义或规律的字符串。主要的元字符如下:

元字符 含义
. 小数点,代表除了换行符以外的任意字符
\ 转义,若我想匹配一些被正则表达式占用的字符,例如小数点,可以用\.
[abc] 匹配中括号内的字符,例如[a-zA-Z],可以匹配到大小写字母
[^abc] 不匹配中括号内的字符,例如[^a-z],表示不匹配小写字母
\w 可以匹配字母、下划线和数字,相当于[a-zA-Z0-9_]
\W 大写的W是小写的w相反情况,也就是不匹配字母、下划线和数字。相当于[^a-zA-Z0-9_]
\s 匹配任意空白符,相当于[\f\n\r\t\v]
\S 匹配任意非空符,相当于[^\f\n\r\t\v]或[^\s]
\d 匹配数字,相当于[0-9]
\D 匹配非数字,相当于[^0-9]
\b 匹配单词的边界。这个匹配英文单词特别有用。例如\b[\w']+?\b就可以匹配任意单词了
\f 匹配换页符
\n 匹配换行符
\r 匹配回车符
\t 匹配tab制表符
\v 匹配垂直制表符
^ 不在中括号内的^,表示从字符串的开头开始匹配
$ 表示匹配到字符串的结尾
x|y 匹配x或y
(表达式) 元组,用小括号括起来的表达式当作一个元组,可以当作一个整体,也可以被\1\2\3这样类似索引获取。

元字符比较多,这里就建议大家先收藏,需要用的时候再查阅。多用几次就自然记住了。

这里还有个小技巧,若我想匹配全部任意字符,包括换行符。可以用一组相反的元字符,例如[\s\S],就可以匹配全部任意字符。

5、常见的正则表达式

说了这么多,晕了没?看一些实例:

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)匹配汉字,汉字需要通过编码转义,汉字都unicode编码中都在一个范围内。正则表达式:[\u4e00-\u9fa5]

6、vba中使用正则表达式

若只是上面这些内容,那么还是纸上谈兵,需要应用到实际中。看看如何在vba中使用正则表达式。

vba使用正则表达式需要用到一个RegExp对象。

该对象可以通过引用Microsoft VBScript Regular Expressions 5.5。再声明定义:

  1. Dim reg As New RegExp

还可以直接用CreateObject方法创建:

  1. Dim reg As Object
  2. set reg = CreateObject("VBScript.Regexp")

创建RegExp对象之后,看看它的相关属性和方法。

属性:

1)Global,是否全局匹配,若为False,匹配到一个结果之后,就不再匹配。默认False,建议设为True;

2)IgnoreCase,是否忽略大小写,默认False,建议设为False,这个会影响到正常表达式匹配;

3)Multiline,是否跨行匹配,默认False,建议设为False,这个会影响到正常表达式匹配;

4)Pattern,获取或设置正则表达式。

方法:

1)Execute,执行匹配

2)Replace,根据正确表达式全部替换

3)Test,测试正则表达式能否匹配到内容

举一些典型的例子:

1)判断是否存在数字

  1. Public Function CheckNumber(str As String) As Boolean
  2. Dim reg As Object
  3. Set reg = CreateObject("VBScript.Regexp")
  4. Dim is_exist As Boolean
  5. With reg
  6. .Global = True
  7. .Pattern = "\d"
  8. is_exist = .Test(str)
  9. End With
  10. CheckNumber = is_exist
  11. End Function

用Test方法,判断能否匹配到数字。

2)获取所有编号

  1. Public Sub GetCode()
  2. Dim reg As Object
  3. Set reg = CreateObject("VBScript.Regexp")
  4. Dim str As String
  5. str = "编号:ABC123155 日期:2016-01-11" & _
  6. "编号:ABD134215 日期:2016-02-21" & _
  7. "编号:CBC134216 日期:2016-01-15"
  8. reg.Global = True    reg.Pattern = "[A-Z]{3}\d+"        '获取匹配结果'
  9. Dim matches As Object, match As Object
  10. Set matches = reg.Execute(str)
  11. '遍历所有匹配到的结果'
  12. For Each match In matches
  13. '测试输出到立即窗口'
  14. Debug.Print match
  15. Next
  16. End Sub

因为这个编号是3个大写字母和多个数字组成。可以利用代码中的表达式匹配到3个结果:ABC123155、ABD134215和CBC134216。

3)去掉字符串中的数字

  1. Public Function ClearNumber(str As String) As String
  2. Dim reg As Object
  3. Set reg = CreateObject("VBScript.Regexp")
  4. reg.Global = True
  5. reg.Pattern = "\d"
  6. '把所有数字替换成空'
  7. ClearNumber = reg.Replace(str, "")
  8. End Function

执行ClearNumber函数,即可去掉数字。例如ClearNumber("你342好234啊"),可得到"你好啊"。

4)获取子字符串

例如想获取某些字符串中的部分数据,可以匹配完成之后,再用字符串函数处理。但其实不用,用元组可以一次性搞定。

  1. Public Sub GetHref()
  2. Dim reg As Object
  3. Set reg = CreateObject("VBScript.Regexp")
  4. Dim str As String
  5. str = "<a href='xxx1'>xxx1</a><a href='xxx2'>xxx2</a>"
  6. reg.Global = True
  7. '获取a标签中href的属性值'
  8. reg.Pattern = "href='(.+?)'"
  9. '获取匹配结果'
  10. Dim matches As Object, match As Object
  11. Set matches = reg.Execute(str)
  12. '遍历所有匹配到的结果'
  13. For Each match In matches
  14. '测试输出子表达式到立即窗口'
  15. Debug.Print match.SubMatches(0)
  16. Next
  17. End Sub

这里,可以通过match的SubMatches集合获取元组里面的内容。轻松得到xxx1和xxx2。

7、其他说明

vba的正则表达式不是很完整,没有递归的功能。递归是可以匹配公式或html代码等。有兴趣可以了解一下。

最近用到正则,故整理总结一下正则表达式中的一些需要转义的特殊字符,以备日后查询。

特别字符

说明

$

匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或
‘\r’。要匹配 $ 字符本身,请使用
\$。

( )

标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。

*

匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。

+

匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。

.

匹配除换行符 \n之外的任何单字符。要匹配.,请使用\.

[ ]

标记一个中括号表达式的开始。要匹配 [,请使用 \[。

匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 字符,请使用 \ 。

\

将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’
匹配换行符。序列 ‘\\’ 匹配 “\”,而 ‘\(‘ 则匹配 “(”。

^

匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。

{ }

标记限定符表达式的开始。要匹配 {,请使用 \{。

|

指明两项之间的一个选择。要匹配 |,请使用 \|。

PS:经过后面使用发现/也需要转义,转义为

//

vba正则表达式入门相关推荐

  1. JavaScript正则表达式详解(一)正则表达式入门

    JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...

  2. 正则表达式入门之字符匹配

    正则表达式入门-字符匹配 在前段时间进行文本挖掘练习的时候,不会使用正则表达式,深感不宜.所以这里,我想赶紧学习一下正则表达式. 注:本文是对<正则表达式必知必会>的复习. 1.正则表达式 ...

  3. excel vba 从入门到精通_VBA词汇-基本元素篇

    在公众号发布学习VBA需要哪些基础知识这篇文章后,有朋友给我们留言,希望可以出一份VBA基础的英语知识贴. 其实相关的内容我们会在后面所对应知识点一一进行讲解,提前剧透其实会少很多学习未知知识的乐趣哦 ...

  4. VBA语言入门:一些简单语法在Excel应用实例

    首先,想看详细教程请转向:Excel VBA编程教程 接下来我想介绍一下VBA快速入门最基本的语法. 处理的主函数: Sub fun() ... End Sub 这个语法在c++中可以类比为main, ...

  5. 绿色版的正则表达式测试工具及正则表达式入门教程

    下载网址:https://download.csdn.net/download/xyz846/10856604 RegexTester是一款正则表达式测试器,支持单行模式.多行模式,经典的窗口设计,该 ...

  6. 正则表达式入门-findall()函数

    正则表达式入门-findall()函数 findall()函数 例子 import re a = '123abc' re=re.findall('\d\d\d',a) print(re) 导入用于完成 ...

  7. 正则表达式发明者_【D1n910】正则表达式入门(三)

    正常操作,正常分析,大家好,我是D1n910. 最近又发生了一些很严重的事情,祥林嫂是可怜的,可是因为又祥林嫂的存在,让一些人可能不愿意向别人倾诉自己"悲惨"的经历了. 正则表达式 ...

  8. 【python学习】正则表达式入门

    python正则表达式入门学习 前言 今天进入python正则表达式的入门学习 学习正则表达式的初衷还是为了awd比赛做准备 (好吧,其实学习python都是为了ctf啊) 学习的目的就是为了可以提取 ...

  9. 正则表达式入门与进阶

    文章目录 正则表达式入门部分 一.字符组 二.区间 三.特殊字符转义符 四.字符组取反 五.快捷方式 5.1 匹配单词字符.数字 5.2 匹配空白 5.3 匹配单词边界 5.4.快捷方式取反 5.5. ...

  10. Python 正则表达式入门(初级篇)

    唯心不易(转载) https://www.cnblogs.com/chuxiuhong/p/5885073.html Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门 ...

最新文章

  1. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(颜色配置:连续色彩、离散色彩、色彩梯度)实战
  2. 手脱FSG 2.0 - bart/xt
  3. Model Search:炼丹师最强危机,谷歌开源最强AutoML工具!
  4. 计算卷积神经网络中参数量
  5. Spark入门(二)多主standalone安装
  6. html内容点击按钮自动复制,HTML页面---复制按钮的使用(包含弹层)
  7. 116_Power Pivot 先进先出原则库龄库存计算相关
  8. [Android] 针对生成的图片文件在系统Gallery不显示的处理
  9. hdu 1969 Pie(二分查找)
  10. android alertdialog 自定义时间,Android自定义dialog可选择展示年月日时间选择栏
  11. [android] android下文件访问的权限
  12. 用手机远程控制扫描仪
  13. java-net-php-python-jsp网上拍卖系统计算机毕业设计程序
  14. systemverilog中rand机制的 $urandom_range()函数
  15. JAVA设计模式——第 8 章 适配器模式【Adapter Pattern】(转)
  16. 计算机网络三级考试题型,计算机三级网络技术考试题型分析
  17. 侧扫声呐XTF格式数据获取
  18. css样式(火狐的兼容性问题)
  19. 自己开发的瓦片地图下载器,免费绿色
  20. PC微信扫码登录教程

热门文章

  1. 苹果鼠标驱动_EFI引导目录drivers64UEFI文件夹(.efi)文件驱动介绍
  2. 苹果电脑系统如果删除驱动
  3. ios 手游SDK 开发教程
  4. HTTP方法的幂等性
  5. html rgb 颜色转换,将RGBA颜色转换为HTML颜色代码
  6. 商业云平台和开源云平台
  7. miou 代码 VOC2012
  8. php 怎么改迅雷,php实现把url转换迅雷thunder资源下载地址的方法
  9. RBF神经网络及其应用【神经网络】
  10. 用友python模块_最新用友NC6.5文件上传漏洞