初窥正则表达式,让处理字符串异常简单
本文由按键学院提供技术支持
按键学院交流群(1群已满):376122403
零基础学按键精灵群(2群):372671254
引用
谈到正则表达式,可能很多童鞋都是一头雾水:什么是正则表达式?干嘛用的?而一些对于正则有所了解的童鞋则会谈虎色变,觉得正则表达式虽然用的命令少,但是自己就是写不出来。对于比较熟悉正则的童鞋来说,正则表达式简直是神器!利用他可以解决很多问题,能够化繁为简。
上面说了这么多,总归一句话,正则表达式其实就是一种针对字符串的匹配和处理的方法
[tr=YellowGreen]
正则有什么用? 正则表达式有什么用? 在上面的引言里已经说明过了,它是一种用来精确匹配字符串的的方法。
说白了就是在串字符串里提取出你想要的信息。一些童鞋会感到奇怪了,按键精灵本身就有mid函数可以用来提取字符串了,为什么要用这个什么正则表达式?{:4_92:}
确实,按键精灵本身会字符串处理的方法,但是他对于精确提取信息方面不够强大、准确。
举个例子来说:
引用
正则表达式,又13655973216称正规表示法、常规表示法(英语:Regular Expression,在代码中常15655982354简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系17922654936列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式13555982269通常被用来检索、替换那些符合某个模式的文本。
我现在想要把上面这段文字里的红色部分的号码全部的提取出来。
如果是使用传统的方法mid的方法要怎么做呢?
引用
1、先从头开始使用循环提取出每个字符
2、在循环中进行判断,如果是数字的话,就把这个数字存放在一个变量里并且重复叠加之前记录的数字
3、再进行判断这个变量的长度,如果超过了11位数,就记录下当前遍历到的位置
4、已当前遍历的位置开始继续往下遍历循环
这就是使用传统的方法提取这个字符串信息的思路。写到这里,小编我也实在是忍不住说一句:
喵了个咪的!!这么复杂的流程就只为了提取出这几个号码!{:4_94:}
我想大家看了之后都有这个念头吧。这个方法简直太坑啦!!
接下来,小编就用正则的方式来提取这几个号码给大家看看。(看完要记得保持冷静!)- //把文本内容存放在变量里
- text = "正则表达式,又13655973216称正规表示法、常规表示法(英语:Regular Expression,在代码中常15655982354简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系17922654936列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式13555982269通常被用来检索、替换那些符合某个模式的文本。"
- Dim regEx, Matches, Match '需要用到的几个变量
- set regEx = New RegExp '创建一个RegExp对象
- regEx.[Global] = TRUE '设置全局可用性为TRUE,在需要更换此属性时,我会提醒你的。
- regEx.IgnoreCase = FALSE '设置区分大小写为FALSE,也就是不区分大小写了
- regEx.pattern ="\d+" '设置正则表达式
- Set matches = regEx.execute(text) '进行匹配
- For Each Match In Matches
- texts = Match & vbcrlf & texts
- next
- MessageBox texts
大家看到了吗?区区的几行代码就能实现这个复杂的提取功能,比传统的方法好用了不止一星半点啊 [tr=YellowGreen]
正则怎么用? 通过上面的例子,大家也能明白正则的碉堡之处了。那现在我们就来学习下要怎么使用吧!!
我们先分解下上面的代码
- Dim regEx, Matches, Match '需要用到的几个变量
- set regEx = New RegExp '创建一个RegExp对象
- regEx.[Global] = TRUE '设置全局可用性为TRUE,在需要更换此属性时,我会提醒你的。
- regEx.IgnoreCase = FALSE '设置区分大小写为FALSE,也就是不区分大小写了
这段代码大家可以不用多管,他主要是用来创建正则对象以及设定一些属性的,基本上不用改,直接复制使用即可
- regEx.pattern ="\d+" '设置正则表达式
这里才是正则表达式的重中之重,
[0-9]+ 这个就是用来匹配出刚才数字所使用的表达式。不同的表达式组合方式可以用来匹配不同的字符串信息,灵活的吧表达式组合起来,基本上就没有你匹配不到的信息。
- Set matches = regEx.execute(text)
- For Each Match In Matches
- TracePrint Match
- next
这句这是把保存在变量里的字符串使用上面的表达式进行匹配,然后输利用循环进行输出匹配到的信息
[tr=YellowGreen]
表达式应用 上面我们已经解释了正则表达式的重要性,那现在我们来进一步了解下表达式
引用
一个完整的正则表达式,是有多个元字符进行组合构成的
元字符总体来说可以分成三大类:
匹配字符、匹配位置、匹配次数用来表达
匹配字符的元字符主要有:(这里只先列举部分) 用来表达
匹配位置的元字符主要: 用来表达
匹配次数的元字符主要:(这里只先列举部分) 一个完整的正则表达式应该是这样:
从什么地方开始,查找什么字符。查找多少次然后它就会返回出所有符合这个条件的字符串
我们就以文章开头的表达式来分析下:
“\d+” 这个表达式表示什么意思呢?引用
\d是表示任意的数字,+ 是表示匹配前面的这个字符多次。那这个表达式就可以理解为,从字符串的开头开始,匹配任意数字(\d)多次(+)。(如果没有特别指出开头位置的话,都是默认从开头开始匹配)说白了只要是一连串的数字用他都能直接匹配出来,所以在上面的这个text变量信息里就能把所有的号码提取出来
现在说说其他的元字符意思
.(点)它是用来匹配除了换行符以外的所有字符,可以包括数字、大小写英文、符号、中文等等。 + 它是用来定义匹配的次数,用来匹配前一个字符一次或者多次的范例:在字符串“sdfjwoanjianjinlinglind1234423”里使用 “a.+g”来匹配的话会得到 “anjianjinling”这个字符串
分析:.+可以表达任意数量不包含换行符的字符。结合上面的表达式意思就是:提取出以字母a开头字母g结尾的字符,在这两个字母之间,不论有多少其他的字符(除换行符外)都能提取出来。
\w 它是用于匹配包括下划线在内的单词的范例: 在字符串“hi,root pic_root ”里使用 “\w+”来匹配的话会分别得到hi 和root以及pic_root 这三个结果
\d 它是用来匹配数字的。范例:表达式 “0\d\d-\d\d\d\d\d\d\d\d” 这个可以匹配出字符串里以0开头带有三位数区号的固话:101-8803086 这样格式的数字
现在再来说是 “*” “+” “?” 这三个的区别
大家仔细看上面的表格说明,可以发现他们都是匹配次数,只是匹配的次数略有不同
范例:“
r.+g” 这个表达式可以匹配出 reg,resdfg 这样的字符,但是无法匹配出 rg 这个字符,因为他的匹配次数至少是1次,但是rg这个单次里r和g之间并没有任何其他的字符,所以无法匹配到“
r.*g” 这个表达式可以匹配出 reg,resdfg,rg 这样的字符 。因为他对于匹配的次数没有限制“
r.?g” 这个表达式可以匹配出 reg,rg 这样的字符,但是无法匹配出 resdfg 这样的字符,因为他匹配的次数最多是1次,resdfg 这个单词中间的字符不只有一个,所以无法被匹配到。 ^ 这个是匹配一行的开始。“^When in” 这个表达式可以从字符串 “When in the course of human events" 当中匹配到,但是无法从“What and When in the” 当中匹配,因为When in 这个并不是在一行的开头位置
$ 这个是匹配行结束符。“weasel$” 这个表达式可以从字符串 “He's weasel” 当中匹配到,但是 “He's weasel a ”这个就无法匹配了,因为这个字符串不是以weasel 为结尾的。 [tr=YellowGreen]
后记 正则表达式虽然命令少,单个命令拿出来都可以比较好的理解,但是想要能灵活的应用还是需要花费一些时间的。这篇的院刊只是一个开头,之后还会有后续的正则表达式系列教学院刊发布出来,到最后引导大家结合POST技术一起来制作一些脚本工具。为啥是结合POST?因为正则表达式最适合应用在从网页源码里提取想要的信息,可以说正则和POST是一对好基友,两者基本上不可分离。{:4_91:}
如果童鞋们想要继续学习正则表达式的话,请继续关注之后的正则表达式系列院刊~~{:4_112:} {:4_112:} {:4_112:} 院刊目录http://bbs.anjian.com/thread-549014-1-1.html