正则表达式进阶
本文由按键学院提供技术支持
按键学院交流①群(1群已满):376122403
按键学院交流②群(2群):372671254
按键学院交流③群(3群):170084238
在之前的正则系列的院刊中,已经给大家初步的介绍了正则表达式的使用方法,以及介绍了部分常用的表达式元字符,这次继续给大家介绍下其他的常用的元字符,以及一些正则的匹配技巧 正则系列:初窥正则表达式,让处理字符串异常简单 |
我们在之前已经介绍了元字符的分类,以及每个分类下的比较常用的元字符,比如说. \w \d ^ $ * + ?
今天就再继续补充其他的一些元字符
元字符 | 描述 |
\ | 将下一个字符标记为特殊字符或字面值 |
() | 与模式匹配并记住匹配 |
| n为非负的整数。匹配恰好n次 |
{n,} | n为非负的整数。匹配至少n次 |
{n,m} | m和n为非负的整数。匹配至少n次,至多m次。 |
[xyz] | 一个字符集。与括号中字符的其中之一匹配。 |
[^xyz] | [^xyz] |
[a-z] | 表示某个范围内的字符。 |
\b | 与单词的边界匹配,即单词与空格之间的位置。 |
\f | 与分页符匹配。 |
\n | 与换行符字符匹配。 |
\r | 与回车字符匹配。 |
\s | 与任何白字符匹配,包括空格、制表符、分页符等。 |
\S | 与任何非空白的字符匹配。 |
\t | 与制表符匹配。 |
\v | 与垂直制表符匹配。 |
\num | 匹配num个,其中num为一个正整数。引用回到记住的匹配 |
\n | 匹配n,其中n是一个八进制换码值。(这里的n和上面换行符是不同的) |
\xn | 匹配n,其中n是一个十六进制的换码值。十六进制换码值必须恰好为两个数字长 |
上面列出了一些比较常用的元字符,一些元字符的使用方法都是比较雷同的,只是代表的字符不一样,所以这里就拿出一部分作为进一步讲解
\ 这个元字符的意义在于可以用来匹配字符当中的元字符符号。比如说 “anjian*jinglinganjian” 我想要从这个字符里匹配出 “*jingling”这个部分,但是* 这个符号本身也代表这一个元字符,无法直接匹配,所以这里就需要使用到 \ 这个元字符了,
"\*jingling" 使用这个表达式就能够把 * 号当成是普通的字符进行匹配了
() 小括号 这个元字符应用的比较广泛,他是可以单独把匹配得到的一部分内容提取出来。还是以上面的字符串作为例子:
“anjian*jinglinganjian” 使用 “an(.+)ling” 这个表达式进行匹配,就是可以匹配得出 jian*jing 这个字符。这个表达式的含义就是把以an开头ling结尾的中间的部分单独提取出来
使用了这个小括号匹配信息之后,正则会把这个结果作为子匹配结果,在使用代码输出的时候就需要变动下输出的方式
- text = "anjian*jinglinganjian"
- Dim regEx, Matches, Match '需要用到的几个变量
- set regEx = New RegExp '创建一个RegExp对象
- regEx.[Global] = TRUE '设置全局可用性为TRUE,在需要更换此属性时,我会提醒你的。
- regEx.IgnoreCase = FALSE '设置区分大小写为FALSE,也就是不区分大小写了
- regEx.pattern ="an(.+)ling" '设置正则表达式
- Set matches = regEx.execute(text) '进行匹配
- For Each Match In Matches
- TracePrint Match.SubMatches(0) '输出正则的子匹配内容
- next
复制代码Match.SubMatches(0) 这个就是用来输出第一个子匹配内容,要输出第二个子匹配就把0改成1,以此类推。
这个元字符是用来指定匹配前一个字符的次数的。例如"o{2}"不能与"Bob中的"o"匹配,但是可以与"foooood"中的前两个o匹配。
[xyz] 这个元字符是表示会匹配这个中括号里的字符的其中一个字符。例如,"[abc]"匹配"plain"中的"a"。
[^xyz] 这个是[xyz] 的反义匹配,代表这不匹配这括号里的字符。^ 这个符号如果使用在中括号里,都是代表这反义匹配
[a-z] 这个比较好理解,就是匹配一个范围内的字符。[a-z]就代表这英文的26个字母,[0-9]代表这数字
\b 这个是用来匹配处于边界的字符的,就是当前一个字符是处于单词的边界的时候才会匹配到。例如:“anjian\b” 这个表达式可以匹配到 “anjian*jingling” 这个字符串当中的 anjian 但是无法匹配到 “anjianjingling” 这里的 anjian,因为这里的anjian并不是单独的单词,而是连接在anjianjingling 整个单词里的。
\num 这个是用来进行后向引用的。他是配合()小括号用的。在使用了小括号提取子匹配之后系统会自动为这个子匹配生成一个组号,然后可以用这个规则重复的调用这个组号用来之后的重复匹配
例如:“\b(\w+)\b\s+\1\b” 这个表达式可以用来匹配重复的单词,比如 “anjian anjian” 这样的字符。这表达式里的 \1 就是调用了(\w+) 这个子匹配
学习了正则,那现在我们就来综合所学的知识试着进行一些字符出来
咱们现在就以按键论坛的院刊板块的源网页,来实现把这一页的院刊标题全部匹配出来院刊板块地址:http://bbs.anjian.com/forum.php?mod=forumdisplay&fid=2501、打开网页之后右键点击页面,选择“查看源代码”,之后就可以看到这个页面的源代码
2、我们先随便找一个标题的代码来看看,比如这个:
<a href="thread-565244-1-1.html" style="font-weight: bold;color: #EE1B2E" class="xst" >1000多篇按键精华教程,再不下载我就删掉啦!!</a>
这个就是其中一篇帖子的标题的源代码,其中
“thread-565244-1-1.html” 这个是这个帖子的链接,“
1000多篇按键精华教程,再不下载我就删掉啦!! ”这个就是帖子的标题了
我们现在就试着把这个链接和标题給提取出来。
3、首先我们需要同时提取两种字符,所以需要使用到小括号,因为链接和标题可能是由英文和中文数字构成的,所以就可以直接用 (.+) 来匹配到
链接后面的style开头的一串我们不需要的字符也可以使用 .+来匹配表示
整个分析完毕后我们就可以得出这个表达式了:
<a href="(thr.+html).+>(.+)</a>使用这个表达式就可以把链接和标题分别提取出来了。
- text = Lib.网络.获得网页源文件("http://bbs.anjian.com/forum.php?mod=forumdisplay&fid=250") '获取网页源文件
- Dim regEx, Matches, Match '需要用到的几个变量
- set regEx = New RegExp '创建一个RegExp对象
- regEx.[Global] = TRUE '设置全局可用性为TRUE,在需要更换此属性时,我会提醒你的。
- regEx.IgnoreCase = FALSE '设置区分大小写为FALSE,也就是不区分大小写了
- regEx.pattern ="<a href=""(thr.+html).+>(.+)</a>" '设置正则表达式
- Set matches = regEx.execute(text) '进行匹配
- For Each Match In Matches
- TracePrint Match.SubMatches(0)'输出帖子链接
- TracePrint Match.SubMatches(1)'输出帖子标题
- Next
复制代码 这里只是初步介绍了正则的简单使用方法,意图在于引导大家能够去熟悉正则,并且了解到正则表达式的用处优点。
关于正则其实还有很多比较复杂的语法,这里就不多介绍了,如果童鞋们感兴趣的话可以在百度上搜索到相关的教程。
目前为止正则表达式的基本用法已经介绍的差不多了,在下一次,小编会带领大家一起结合POST技术,来完成一些实战的小工具,大家敬请期待 相关院刊:正则表达式系列一:初窥正则表达式,让处理字符串异常简单showtopic.aspx?topicid=571764&forumpage=1&page=1正则表达式系列三:正则实战-论坛贴吧一键签到showtopic.aspx?topicid=572284&forumpage=1&page=1院刊总目录http://bbs.anjian.com/forum.php?mod=forumdisplay&fid=250
谢谢大家阅读,记得给小编送支花花 ! 顺手点个赞
[tr=rgb(143, 188, 143)] |
按键精灵免费公开课
| 实战班:回合制通用教学火热报名 |
【听课对象】:对按键精灵感兴趣的同学们都可以来~ 【上课地点】:零基础学按键精灵群(372671254) 【上课时间】:周天晚上19:30-21:00 【上课内容】:按键精灵脚本基础经验谈——图色命令
| 本期重点:回合制游戏--神武 学习时效:终生有效 上课时间:周2、周4、周6的 20:00--22:00 导师:工程师07 技术支持:果儿(院刊编辑) |
点我进入按键学院报名啦 招生细节进群咨询招生办主任:2群-372671254(优先加入) 1群-376122403
|