初窥正则表达式,让处理字符串异常简单

社区服务
高级搜索
猴岛论坛辅助工具初窥正则表达式,让处理字符串异常简单
发帖 回复
正序阅读 最近浏览的帖子最近浏览的版块
0个回复

初窥正则表达式,让处理字符串异常简单

楼层直达
mimi_rice

ZxID:55494225

等级: 上士
举报 只看楼主 使用道具 楼主   发表于: 2015-05-20 0

初窥正则表达式,让处理字符串异常简单


本文按键学院提供技术支持


按键学院交流群(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:}
我想大家看了之后都有这个念头吧。这个方法简直太坑啦!!

接下来,小编就用正则的方式来提取这几个号码给大家看看。(看完要记得保持冷静!)
  1. //把文本内容存放在变量里
  2. text = "正则表达式,又13655973216称正规表示法、常规表示法(英语:Regular Expression,在代码中常15655982354简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系17922654936列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式13555982269通常被用来检索、替换那些符合某个模式的文本。"
  3. Dim regEx, Matches, Match '需要用到的几个变量
  4. set regEx = New RegExp '创建一个RegExp对象
  5. regEx.[Global] = TRUE '设置全局可用性为TRUE,在需要更换此属性时,我会提醒你的。
  6. regEx.IgnoreCase = FALSE '设置区分大小写为FALSE,也就是不区分大小写了
  7. regEx.pattern ="\d+" '设置正则表达式
  8. Set matches = regEx.execute(text) '进行匹配
  9. For Each Match In Matches
  10.         texts = Match & vbcrlf & texts
  11. next
  12. MessageBox texts


  
大家看到了吗?区区的几行代码就能实现这个复杂的提取功能,比传统的方法好用了不止一星半点啊





[tr=YellowGreen]正则怎么用?


通过上面的例子,大家也能明白正则的碉堡之处了。那现在我们就来学习下要怎么使用吧!!
我们先分解下上面的代码
  1. Dim regEx, Matches, Match '需要用到的几个变量
  2. set regEx = New RegExp '创建一个RegExp对象
  3. regEx.[Global] = TRUE '设置全局可用性为TRUE,在需要更换此属性时,我会提醒你的。
  4. regEx.IgnoreCase = FALSE '设置区分大小写为FALSE,也就是不区分大小写了

这段代码大家可以不用多管,他主要是用来创建正则对象以及设定一些属性的,基本上不用改,直接复制使用即可

  1. regEx.pattern ="\d+" '设置正则表达式

这里才是正则表达式的重中之重,[0-9]+ 这个就是用来匹配出刚才数字所使用的表达式。
不同的表达式组合方式可以用来匹配不同的字符串信息,灵活的吧表达式组合起来,基本上就没有你匹配不到的信息。

  1. Set matches = regEx.execute(text)
  2. For Each Match In Matches
  3.         TracePrint Match
  4. next

这句这是把保存在变量里的字符串使用上面的表达式进行匹配,然后输利用循环进行输出匹配到的信息




[tr=YellowGreen]表达式应用
上面我们已经解释了正则表达式的重要性,那现在我们来进一步了解下表达式
引用
一个完整的正则表达式,是有多个元字符进行组合构成的

元字符总体来说可以分成三大类:匹配字符、匹配位置、匹配次数
用来表达匹配字符的元字符主要有:(这里只先列举部分)





元字符 描述
. 匹配换行符以外的任何字符。
\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 为结尾的。



[tr=YellowGreen]后记

正则表达式虽然命令少,单个命令拿出来都可以比较好的理解,但是想要能灵活的应用还是需要花费一些时间的。这篇的院刊只是一个开头,之后还会有后续的正则表达式系列教学院刊发布出来,到最后引导大家结合POST技术一起来制作一些脚本工具。为啥是结合POST?因为正则表达式最适合应用在从网页源码里提取想要的信息,可以说正则和POST是一对好基友,两者基本上不可分离。{:4_91:}

如果童鞋们想要继续学习正则表达式的话,请继续关注之后的正则表达式系列院刊~~{:4_112:} {:4_112:} {:4_112:}




院刊目录
http://bbs.anjian.com/thread-549014-1-1.html

« 返回列表
发帖 回复