首页
编程教程
编程导航
编程百科
编程问答
编程博文
编程实例
硬件设备
网络运营
软件教程
移动数码
办公软件
操作系统
网络运维
设计教程
正则表达式在网页处理中的应用四则
正则表达式
2020-06-21
正则表达式(Regular Expression)为字符串模式匹配提供了一种高效、方便的
方法
。几乎所有高级语言都提供了对正则表达式的
支持
,或者提供了现成的
代码
库供
调用
。本文以ASP环境中常见的处理任务为例,介绍正则表达式的应用技巧。 正则表达式(Regular Expression)为字符串模式匹配提供了一种高效、方便的
方法
。几乎所有高级语言都提供了对正则表达式的
支持
,或者提供了现成的
代码
库供
调用
。本文以ASP环境中常见的处理任务为例,介绍正则表达式的应用技巧。 一、检验密码和
邮件
地址的格式 我们的第
一个
实例示范正则表达式的一项基本
功能
:抽象地描述任意复杂的字符串。它的意思就是,正则表达式给予程序员一种形式化的字符串描述
方法
,只需很少的
代码
即可描述出应用遇到的任意字符串模式。例如,对于不从事技术工作的人来说,密码格式的要求可以描述如下:密码的第
一个
字符必须是字母,密码最少4个字符且不超过15个字符,密码不能包含除字母、数字和下划线以外的字符。 作为程序员,我们必须把上面对密码格式的自然语言描述转换成其他形式,使得ASP
页面
能够理解并应用它来防止非法的密码输入。描述这个密码格式的正则表达式是:^[a-zA-Z]\w{3,14}$。在ASP应用里,我们可以把密码验证过程写成可重用的
函数
,如下所示: Function TestPassword(strPassword)Dim reSet re = new RegExpre.Ig
nor
eCase = falsere.global = falsere.Pattern = "^[a-zA-Z]\w{3,14}$"TestPassword = re.Test(strPassword)End Function 下面我们把这个检验密码格式的正则表达式和自然语言描述对比着看看: 密码的第
一个
字符必须是字母:正则表达式描述是“^[a-zA-Z]”,其中“^”表示字符串的开始,连字符告诉RegExp匹配指定范围的所有字符。 密码最少4个字符且不超过15个字符:正则表达式描述是“{3,14}”。 密码不能包含除字母、数字和下划线以外的字符:正则表达式描述是“\w”。 几点说明:{3,14}表示前面的模式匹配至少3个、但不超过14个的字符(
加上
第
一个
字符就成了4到15个字符)。注意花括号内的语法要求极其严格,不允许在逗号的两边加入空格。如果加入了空格,它将对正则表达式的含义产生影响,导致密码格式检验时产生
错误
。另外,上面的正则表达式末尾也没有
加上
“$”字符。$字符使得正则表达式匹配字符串直至末尾,确保合法的密码后面没有
加上
任何其他字符。 类似于密码格式检验,检查email地址的合法性也是
一个
很常见的问题,用正则表达式进行简单的email地址检验可以实现如下: <%Dim reSet re = new RegExpre.pattern = "^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$"Response.Write re.Test("aabb@yahoo.com")%> 二、
提取
HTML
页面
的特定部分 从HTML
页面
提取
内容
所面临的主要问题是,我们必须寻找一种
方法
精确地识别出自己想要的那一部分
内容
。例如,下面是
一个
显示
新闻
标题
的
HTML代码
片断: <table border="0" width="11%" class="Somestory"><tr><td width="100%"><p align="center">其他
内容
...</td></tr></table><table border="0" width="11%" class="Headline"><tr><td width="100%"><p align="center">伊拉克战争!</td></tr></table><table border="0" width="11%" class="Someotherstory"><tr><td width="100%"><p align="center">其他
内容
...</td></tr></table> 观察上述
代码
,很容易看出新闻
标题
由位于中
间的
表格
显示
,它的class
属性
设置为Headline。如果HTML
页面
非常复杂,使用Microsoft IE从5.0开始提供的一项附加
功能
可以只查看被选中部
分页
面的
HTML代码
,请访问http://www.microsoft.com/Windows/ie/WebAccess/default.ASP了解详情。对于本例,我们假定这是唯一class
属性
设置为Headline的表格。现在我们要创建正则表达式,通过正则表达式找到这个Headline表格并把这个表格包含到自己的
页面
中。首先是编写
支持
正则表达式的
代码
: <%Dim re,strHTMLSet re = new RegExp ' 创建正则表达式对象re.Ig
nor
eCase = truere.Global = false ' 第一次匹配之后结束查找%> 下面考虑一下我们要
提取
的区域:
在这里
,我们要
提取
的是整个<table>结构,
包括
结束
标记
和新闻
标题
的文本。因此查找的起始字符应该是<table>开始
标记
: re.Pattern = "<table.*(?=Headline)"。 这个正则表达式匹配表格的开始
标记
,能够返回开始
标记
直至“Headline”之
间的
所有
内容
(换行除外)。下面是返回已匹配
HTML代码
的
方法
: ' 把所有匹配的
HTML代码
放入Matches集合Set Matches = re.Execute(strHTML)'
显示
所有匹配的
HTML代码
For Each Item in MatchesResponse.Write Item.ValueNext'
显示
其中一项Response.write Matches.Item(0).Value 运行这段
代码
处理前面
显示
的HTML片断,正则表达式返回一次匹配的
内容
如下: <table border="0" width="11%" class="。正则表达式中的“(?=Headline)”没有
获取
字符,所以不能看到表格class
属性
的值。 要
获取
表格剩余部分的
代码
也相当简单: re.Pattern = "<table.*(?=Headline)(.|\n)*?</table>"。其中:“(.|\n)”后面的“*”匹配0个到多个任意字符;而“?”使得“*”匹配范围最小化,即在找到表达式的下一部分之前匹配尽可能少的字符。</table>是表格的结束
标记
。 “?”限制符非常重要,它防止了表达式返回其他表格的
代码
。例如对于前面给出的
HTML代码
片断,如果
删除
这个“?”则返回
内容
将是: <table border="0" width="11%" class="Headline"><tr><td width="100%"><p align="center">伊拉克战争!</td></tr></table><table border="0" width="11%" class="Someotherstory"><tr><td width="100%"><p align="center">其他
内容
...</td></tr></table> 返回的
内容
不仅包含了Headline表的<table>
标记
,而且还包含了Someotherstory表格,由此可以看出,这里的“?”是必不可少的。 本例假设了一些相当理想化的前提。实际应用中情况往往要复杂得多,特别是你对正在使用的源
HTML代码
的编写没有任何影响力时,编写ASP
代码
尤为困难。最有效的
方法
是,多花些时间分析待
提取
内容
附近的HTML,经常地测试,确保
提取
出来的
内容
正是自己所需要的。 另外,应当重视并处理正则表达式不能匹配源HTML
页面
任何
内容
的情形。
内容
的更新可能非常
快速
,不要只因为别人改变了
内容
的格式而让自己的
页面
出现低级可笑的
错误
。 三、解析文本数据
文件
数据
文件
的格式和种类很多,XML文档、
结构化
文本甚至非
结构化
文本都经常成为ASP应用的数据源。下面我们要看的
一个
例子是使用限定符的
结构化
文本
文件
。限定符(比如引号)表示字符串各个部分不可分割,即使字符串内部包含把记录分隔成字段的分隔符也一样。 下面是
一个
简单的
结构化
文本
文件
: 姓,名,电话,说明孙,悟空,312 555 5656,ASP很好猪,八戒,847 555 5656,我是电影制片人 这个
文件
非常简单,它的第一行是
标题
,下面两行是用逗号作为分隔符的记录。要解析这个
文件
也很简单,只需先把
文件
分割成行(根据换行符号),然后把各个记录按照字段分割。但是,如果我们在某个字段
内容
中加入了逗号: 姓,我喜欢ASP,还有VB和
sql
猪,我是电影制片人 解析第
一个
记录时就会出现问题,因为在只认可逗号分隔符的解析器看来它的最后
一个
字段包含了两个字段的
内容
。为了避免出现这类问题,包含分隔符的字段必须用限定符包围。单引号就是一种常用的限定符。把上面的文本
文件
加上
单引号限定符之后,它的
内容
如下所示: 姓,'我喜欢ASP,还有VB和
sql
'猪,'我是电影制片人' 现在我们能够肯定哪
一个
逗号是分隔符、哪
一个
逗号是字段
内容
了,即只需把引号内部出现的逗号视为字段的
内容
。接下来我们
要做
的就是实现
一个
正则表达式解析器,由这个解析器确定何时根据逗号分割字段、何时把逗号视为字段
内容
。 这里的问题与大多数正则表达式所面临的略有不同。通常我们查看的是文本的一小部分,看看它是否能够和正则表达式匹配。但
在这里
,只有考虑了整行文本之后我们才能可靠地判断出哪些
内容
位于引号之内。 下面是
一个
说明该问题的例子。从某个文本
文件
随意抽取半行
内容
,得到:1,沙滩,黑色,21,',狗,猫,鸭子,。
在这
个例子中,因为“1”的左边还有其他数据,要解析清楚它的
内容
是极其困难的。我们不知道这个数据片断的前面有多少单引号,从而也就无法判断哪些字符位于引号之内(在引号之内的文本解析时不能分割)。如果这个数据片断之前有偶数个(或者没有)单引号,那么“','”是用引号界定的字符串且不可分割。如果前面的引号
数量
是奇数,那么“1,'”是某个字符串的结束部分且不可分割。 因此,正则表达式必须分析整行文本,全面考虑出现了多少引号才能确定字符是处在引号对的内部还是外部,即:,(?=([^']*'[^']*')*(?![^']*'))。这个正则表达式首先找到
一个
引号,然后继续查找并保证逗号后面的单引号
数量
或者是偶数、或者是0。该正则表达式以下面这个判断为基础:如果逗号后面的单引号
数量
是偶数,那么这个逗号位于字符串之外。下表给出了更详细的说明:,寻找
一个
逗号 (?= 继续向前查找以匹配下面这个模式: ( 开始
一个
新的模式 [^']*' [非引号字符]0个或者多个,然后是
一个
引号 [^']*'[^']*) [非引号字符]0个或者多个,然后是
一个
引号。结合前面的
内容
之后它匹配引号对 )* 结束模式并匹配整个模式(引号对)0次或者多次 (?! 向前查找,排除此模式 [^']*' [非引号字符]0个或者多个,然后是
一个
引号 ) 结束模式 下面是
一个
VBScript
函数
,它接受
一个
字符串参数,根据字符串中的逗号分隔符、单引号限定符分割字符串,返回结果数组: Function SplitAdv(strInput)Dim objRESet objRE = new RegExp' 设置RegExp对象objRE.Ig
nor
eCase = trueobjRE.Global = trueobjRE.Pattern = ",(?=([^']*'[^']*')*(?![^']*'))"' Replace
方法
用chr(8)替换我们要用到的逗号,chr(8)即\b' 字符,\b在字符串中出现的可能极为微小。' 然后我们根据\b把字符串分割保存到数组SplitAdv = Split(objRE.Replace(strInput,"\b"),"\b")End Function 总而言之,用正则表达式解析文本数据
文件
具有高效、缩短开发时
间的
优点,能够节省大量分析
文件
、根据复杂的条件
提取
有用数据的时间。在
一个
迅速发展的环境中仍会有许多传统的数据可资利用,掌握如何构造高效的数据分析例程将是一种宝贵的技能。 四、字符串替换 在最后
一个
例子中我们要看看VBScript正则表达式的替换
功能
。ASP经常用于动态地格式化从各种数据源获得的文本。利用VBScript正则表达式的强大
功能
,ASP能够动态地改变匹配的复杂文本。通过加入HTML
标记
突出
显示
部分单词就是一种常见的应用,比如突出
显示
搜索结果
中的
搜索
关键词。 为说明
实现方法
,下面我们来看
一个
突出
显示
字符串中所有“.NET”的例子。这个字符串可以从任何地方获得,比如
数据库
或者其他Web网站。 <
%s
et regEx = New RegExpregEx.Global = trueregEx.Ig
nor
eCase = True' 正则表达式模式,' 寻找任何结尾为“.NET”的单词或者URL。regEx.Pattern = "(\b[a-zA-Z\._]+?\.NET\b)"' 用于测试替换
功能
的字符串strText = "微软建立了
一个
新网站www.ASP.NET。"'
调用
正则表达式的Replace
方法
' $1表示把匹配的文本插入当前位置Response.Write regEx.Replace(strText,_"<b style='color: #000099; font-size: 18pt'>$1</b>")%> 这个例子中有几个重要的地方必须注意。整个正则表达式被放入了一对圆括号中,它的作用是
截取
所有匹配的
内容
供以后使用,这些
内容
在替换文本中通过$1引用。类似的
截取
每次替换可以使用多达9个,分别通过$1到$9引用。正则表达式的Replace
方法
和VBScript本身的Replace
函数
不同,它只需要两个参数:被
搜索
的文本,替换用的文本。
在这
个例子中,为了突出
显示
搜索
到的“.NET”字符串,我们用粗体
标记
以及其他样式
属性
来包围这些字符串。使用这种
搜索
和替换技术,我们能够方便地为网站
搜索
程序
加上
突出
显示
搜索
关键词的
功能
,或者
自动
为
页面
中出现的关键词
加上
指向其他
页面
的
链接
。 结束语 希望本文介绍的几种正则表达式技巧对你在何时、如何应用正则表达式有所启发。虽然本文的例子用VBScript编写,但在ASP.NET中正则表达式同样也大有用武之地,它是服务器端控件表单检验的主要机制之一,而且通过Sy
stem
.Text.RegularExpressions命名空间导出到了整个.NET框架之中。( 您可能感兴趣的
文章
: asp.net(c#) 使用Rex正则来
生成字符串
数组的
代码
asp.net验证
一个
字符串是否符合指定的正则表达式 asp.net中利用正则表达式判断
一个
字符串是否为数字的
代码
详细出处参考:http://www.jb51.net/article/14130.htm
相关文章
正则替换html代码中img标签的src值
正则替换html代码中img标签的src值在开发富文本信息在移动端...
【C++】正则表达式
正则表达式
shell之三剑客awk基础用法
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它...
正则表达式
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及...
Python基础知识进阶之正则表达式
Python界一名小学生,热心分享编程学习。
开发者神器,代码文档终于有救了
收集整理每周优质开发者内容,包括、、等方面。每周五定期发...