初窥正则表达式,让处理字符串异常简单
本文由按键学院提供技术支持
按键学院交流群(1群已满):376122403
零基础学按键精灵群(2群):372671254
谈到正则表达式,可能很多童鞋都是一头雾水:什么是正则表达式?干嘛用的?而一些对于正则有所了解的童鞋则会谈虎色变,觉得正则表达式虽然用的命令少,但是自己就是写不出来。对于比较熟悉正则的童鞋来说,正则表达式简直是神器!利用他可以解决很多问题,能够化繁为简。 上面说了这么多,总归一句话,正则表达式其实就是一种针对字符串的匹配和处理的方法 |
正则表达式有什么用? 在上面的引言里已经说明过了,它是一种用来精确匹配字符串的的方法。
说白了就是在串字符串里提取出你想要的信息。一些童鞋会感到奇怪了,按键精灵本身就有mid函数可以用来提取字符串了,为什么要用这个什么正则表达式?
确实,按键精灵本身会字符串处理的方法,但是他对于精确提取信息方面不够强大、准确。
举个例子来说:
正则表达式,又13655973216称正规表示法、常规表示法(英语:Regular Expression,在代码中常15655982354简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系17922654936列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式13555982269通常被用来检索、替换那些符合某个模式的文本。 |
我现在想要把上面这段文字里的红色部分的号码全部的提取出来。
如果是使用传统的方法mid的方法要怎么做呢?
1、先从头开始使用循环提取出每个字符 2、在循环中进行判断,如果是数字的话,就把这个数字存放在一个变量里并且重复叠加之前记录的数字 3、再进行判断这个变量的长度,如果超过了11位数,就记录下当前遍历到的位置 4、已当前遍历的位置开始继续往下遍历循环 |
这就是使用传统的方法提取这个字符串信息的思路。写到这里,小编我也实在是忍不住说一句:
喵了个咪的!!这么复杂的流程就只为了提取出这几个号码!我想大家看了之后都有这个念头吧。这个方法简直太坑啦!!
接下来,小编就用正则的方式来提取这几个号码给大家看看。(看完要记得保持冷静!)- //把文本内容存放在变量里
- 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
复制代码- 您所在的用户组无法下载或查看附件
大家看到了吗?区区的几行代码就能实现这个复杂的提取功能,比传统的方法好用了不止一星半点啊通过上面的例子,大家也能明白正则的碉堡之处了。那现在我们就来学习下要怎么使用吧!!
我们先分解下上面的代码
- 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
复制代码这句这是把保存在变量里的字符串使用上面的表达式进行匹配,然后输利用循环进行输出匹配到的信息
上面我们已经解释了正则表达式的重要性,那现在我们来进一步了解下表达式
一个完整的正则表达式,是有多个元字符进行组合构成的 |
元字符总体来说可以分成三大类:
匹配字符、
匹配位置、
匹配次数用来表达
匹配字符的元字符主要有:(这里只先列举部分)
元字符 | 描述 |
. | 匹配换行符以外的任何字符。 |
\w | 与任何单词字符匹配,包括下划线。等价于"[A-Za-z0-9_]"。 |
\d | 与一个数字字符匹配。 |
用来表达
匹配位置的元字符主要:
元字符 | 描述 |
^ | 匹配输入的开始位置。 |
$ | 匹配输入的结尾。 |
用来表达
匹配次数的元字符主要:(这里只先列举部分)
元字符 | 描述 |
* | 匹配前一个字符零次或几次。 |
+ | 匹配前一个字符一次或多次 |
? | 匹配前一个字符零次或一次。例如,"a?ve?"可以匹配"never"中的"ve"。 |
一个完整的正则表达式应该是这样:
从什么地方开始,查找什么字符。查找多少次然后它就会返回出所有符合这个条件的字符串
我们就以文章开头的表达式来分析下:
“\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 为结尾的。
正则表达式虽然命令少,单个命令拿出来都可以比较好的理解,但是想要能灵活的应用还是需要花费一些时间的。这篇的院刊只是一个开头,之后还会有后续的正则表达式系列教学院刊发布出来,到最后引导大家结合POST技术一起来制作一些脚本工具。为啥是结合POST?因为正则表达式最适合应用在从网页源码里提取想要的信息,可以说正则和POST是一对好基 友,两者基本上不可分离。 如果童鞋们想要继续学习正则表达式的话,请继续关注之后的正则表达式系列院刊~~ 正则表达式系列之二:正则表达式进阶用法showtopic.aspx?topicid=572284&forumpage=1&page=1正则表达式系列之三:正则实战-论坛贴吧一键签到showtopic.aspx?topicid=572777&forumpage=1&page=1院刊目录showtopic.aspx?topicid=549014&forumpage=1&page=1
谢谢大家阅读,记得给小编送支花花 ! 顺手点个赞
[tr=rgb(143, 188, 143)] | 按键精灵免费公开课 | 实战班:回合制通用教学火热报名 |
【听课对象】:对按键精灵感兴趣的同学们都可以来~ 【上课地点】:零基础学按键精灵群(372671254) 【上课时间】:周天晚上19:30-21:00 【上课内容】:按键精灵脚本基础经验谈——图色命令
| 本期重点:回合制游戏--神武 学习时效:终生有效 上课时间:周2、周4、周6的 20:00--22:00 导师:工程师07 技术支持:果儿(院刊编辑) |
点我进入按键学院报名啦 招生细节进群咨询招生办主任:2群-372671254(优先加入) 1群-376122403
|