ASP中级一——正则表达式讲座记录
作者:晴天  来源:原创  发布时间:2006-12-1 13:45:00  共有948位读者阅读过此文
 

本系统下载(通用类设计)Build0920

http://nnhy.org/CMS/web/index.asp?Act=NewsDetail&NClassID=19&ID=36

这里都是用正则做的

所以,待会作为例子

 

如果原来没有使用过正则表达式,那么可能对这个术语和概念会不太熟悉。不过,它们并不是您想象的那么新奇。

请回想一下在硬盘上是如何查找文件的。您肯定会使用 ? * 字符来帮助查找您正寻找的文件。? 字符匹配文件名中的单个字符,而 * 则匹配一个或多个字符。一个如 'data?.dat' 的模式可以找到下述文件:

data1.dat

data2.dat

datax.dat

dataN.dat

如果使用 * 字符代替 ? 字符,则将扩大找到的文件数量。'data*.dat' 可以匹配下述所有文件名:

data.dat

data1.dat

data2.dat

data12.dat

datax.dat

dataXYZ.dat

尽管这种搜索文件的方法肯定很有用,但也十分有限。? * 通配符的有限能力可以使你对正则表达式能做什么有一个概念,不过正则表达式的功能更强大,也更灵活。

 

正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。

1956 , 一位叫 Stephen Kleene 的数学家在 McCulloch Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。

随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。

如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。

在典型的搜索和替换操作中,必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够了,但是由于它缺乏灵活性,因此在搜索动态文本时就有困难了,甚至是不可能的。

使用正则表达式,就可以:

测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。

替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。

根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。

例如,如果需要搜索整个 web 站点来删除某些过时的材料并替换某些HTML 格式化标记,则可以使用正则表达式对每个文件进行测试,看在该文件中是否存在所要查找的材料或 HTML 格式化标记。用这个方法,就可以将受影响的文件范围缩小到包含要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料,最后,可以再次使用正则表达式来查找并替换那些需要替换的标记。

另一个说明正则表达式非常有用的示例是一种其字符串处理能力还不为人所知的语言。VBScript Visual Basic 的一个子集,具有丰富的字符串处理功能。与 C 类似的 Jscript 则没有这一能力。正则表达式给 JScript 的字符串处理能力带来了明显改善。不过,可能还是在 VBScript 中使用正则表达式的效率更高,它允许在单个表达式中执行多个字符串操作。

正则表达式的简介,就讲到这里。

总之,正则表达式,就是为了提供更快更强大的字符串搜索功能而出现的

 

 

 

下面讲一个简单的例子

"<(.*) (.*)>(.*)<\/\1>"   匹配一个 HTML 标记

关于这个匹配,不怎么好说,这样吧

举个应用上的例子:剔除一段文本中的所有HTML

str"nnhy"

str=Re.Replace(str, "<(.*) (.*)>(.*)<\/\1>", "$2")

这样,所有的HTML标记将会被删去

下面开始详细的说

<(.*) (.*)>(.*)<\/\1>

圆点.代表除 "\n" 之外的任何单个字符,记住是单个字符哦,有点像DOS里面的?

而星号*就代表前面的字符出现零次或者多次,是一个说明前面字符出现次数的标记

同样的标记还有加号+和问号?

加号+ 一次或多次

问号? 零次或一次

 

出现次数的标记,还可以用大括号{}

这个可以定义出现的次数,属于高级功能,很少用到

{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o

{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o'o{1,}' 等价于 'o+''o{0,}' 则等价于 'o*'

{n,m} m n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

.*联合起来,就表示一个除了\n为(外)的字符串

比如 food

对于正则表达式 f.*d

来说,是附合的,fd中间允许有一个\n外的字符串,所以()合,专业一点,就是所谓的匹配啦

 

<(.*) (.*)>(.*)<\/\1>

这个正则表达式

附合

nnhy

这个字符串,我们就说它匹配

呵呵,这就是上面说的难以理解的匹配

在正则表达式中,符号/有特殊用途,所以需要转义,用\/来代替

 

<(.*) (.*)>(.*)<\/\1>

nnhy

第一个(.*)匹配字符串中的font这个字符串

第二个(.*)匹配字符串中的color=red这个字符串

第三个(.*)匹配字符串中的nnhy这个字符串

这,就叫做获取匹配

在本正则表达式中,如果后面需要用到前面的已获取匹配,比如这里的font,则使用\n代表前面第n个已获取匹配的内容

 

 

 

 

 

匹配,通俗一点的说法就是能套得上去

正则表达式就像一个方框,能套上字符串,就说这个字符串匹配该正则表达式

 

下面开始说说如何在ASP中使用正则表达式

下面是取自index.asp的部分代码

              Set Re = New RegExp

              Re.Global = True

              Re.IgnoreCase = True

              Re.Pattern = "{\$SiteColor}"

              ModStr = Re.Replace(ModStr, SiteColor)

首先声明一个正则表达式对象 Re

然后设置全局搜索,也就是对一个字符串进行全面搜索,而不是只搜索一行

IgnoreCase是表示忽略大小写,这个就不用说了吧

下面的Pattern就是正则表达式啦,在这里是 "{\$SiteColor}"

这个很简单,就是代表{$SiteColor}标签啦

好,最后一行,就是把ModStr中,匹配该正则的地方,替换为变量SiteColor的内容

所以嘛,只需要修改一下SiteColor变量的值,就可以更改整个CMS的颜色基调,因为CMS的绝大多数模板,都使用了{$SiteColor}标签

 

轮到JS出场了,大家看看JS对正则表达式的强大支持

        while(/\w+?\/\.\.\//.test(v))//开头和中间 Gen/../

        {

            v=v.replace(/\w+?\/\.\.\//img, "");

        }

v是一个字符串变量

/\w+?\/\.\.\//就是一个正则表达式,/开头和/结尾

\w匹配包括下划线的任何单词字符

+至少出现一次

?在这里是非贪婪,也就是说,在存在多种匹配方案的情况下,要最短的匹配

js的正则,直接可以使用test方法判断字符串v是否匹配

在这里是如果匹配,在进行替换操作

替换就是把匹配该正则的子字符串全部替换为空,也就是删除

img分别是

i忽略大小写

m多行

g全局

讲座完成,时间刚够,欢迎到NewLife上提问

新生命 XCMS1.0 Build0206 版权所有 All Copyrights @2009 桂ICP备06011573号
站长:大石头 信箱:gxuhy@21cn.com QQ:99363590
本站带宽由酷睿数据提供