正则表达式在网页处理中的应用
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
正则表达式(Regular Expression)为字符串模式匹配提供了一种高效、方便的方法。几乎所有高级语言都提供了对正则表达式的支持,或者提供了现成的代码库供调用。本文以ASP环境中常见的处理任务为例,介绍正则表达式的应用技巧。
一、检验密码和邮件地址的格式 我们的第一个实例示范正则表达式的一项基本功能:抽象地描述任意复杂的字符串。它的意思就是,正则表达式给予程序员一种形式化的字符串描述方法,只需很少的代码即可描述出应用遇到的任意字符串模式。例如,对于不从事技术工作的人来说,密码格式的要求可以描述如下:密码的第一个字符必须是字母,密码最少4个字符且不超过15个字符,密码不能包含除字母、数字和下划线以外的字符。 作为程序员,我们必须把上面对密码格式的自然语言描述转换成其他形式,使得ASP页面能够理解并应用它来防止非法的密码输入。描述这个密码格式的正则表达式是:^[a-zA-Z]\w{3,14}$。 在ASP应用里,我们可以把密码验证过程写成可重用的函数,如下所示: Function TestPassword(strPassword) Dim re Set re = new RegExp re.IgnoreCase = false re.global = false re.Pattern = "^[a-zA-Z]\w{3,14}$" TestPassword = re.Test(strPassword) End Function 下面我们把这个检验密码格式的正则表达式和自然语言描述对比着看看: <% Dim re Set re = new RegExp re.pattern = "^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$" Response.Write re.Test("aabb@yahoo.com") %> 二、提取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, strHTML Set re = new RegExp ' 创建正则表达式对象 re.IgnoreCase = true re.Global = false ' 第一次匹配之后结束查找 %>
' 把所有匹配的HTML代码放入Matches集合 Set Matches = re.Execute(strHTML) ' 显示所有匹配的HTML代码 For Each Item in Matches Response.Write Item.Value Next ' 显示其中一项 Response.write Matches.Item(0).Value 运行这段代码处理前面显示的HTML片断,正则表达式返回一次匹配的内容如下: <table border="0" width="11%" class="。正则表达式中的“(?=Headline)”没有获取字符,所以不能看到表格class属性的值。要获取表格剩余部分的代码也相当简单: re.Pattern = "<table.*(?=Headline)(.|\n)*?</table>"。其中:“(.|\n)”后面的“*”匹配0个到多个任意字符;而“?”使得“*”匹配范围最小化,即在找到表达式的下一部分之前匹配尽可能少的字符。</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>
三、解析文本数据文件 姓,名, 电话, 说明 孙,悟空, 312 555 5656, ASP很好 猪,八戒, 847 555 5656, 我是电影制片人
姓,名, 电话, 说明 孙,悟空, 312 555 5656, 我喜欢ASP,还有VB和SQL 猪,八戒, 847 555 5656, 我是电影制片人
姓,名, 电话, 说明 孙,悟空, 312 555 5656, '我喜欢ASP,还有VB和SQL' 猪,八戒, 847 555 5656, '我是电影制片人'
下面是一个VBScript函数,它接受一个字符串参数,根据字符串中的逗号分隔符、单引号限定符分割字符串,返回结果数组: Function SplitAdv(strInput) Dim objRE Set objRE = new RegExp ' 设置RegExp对象 objRE.IgnoreCase = true objRE.Global = true objRE.Pattern = ",(?=([^']*'[^']*')*(?![^']*'))" ' Replace方法用chr(8)替换我们要用到的逗号,chr(8)即\b ' 字符,\b在字符串中出现的可能极为微小。 ' 然后我们根据\b把字符串分割保存到数组 SplitAdv = Split(objRE.Replace(strInput, "\b"), "\b") End Function
<% Set regEx = New RegExp regEx.Global = true regEx.IgnoreCase = 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>") %>
该文章在 2011/2/1 13:23:56 编辑过 |
关键字查询
相关文章
正在查询... |