轻灵自由的珍珠

一个程序应该是轻灵自由的,它的子过程就象串在一根线上的珍珠。自始至终,目标明确。既没有不必要的循环也没有没有被引用的变量,既不缺少结构化也不至于僵硬呆板。

原创 正则表达式之正负向预查使收藏

新一篇: [HTML]下拉输入框--能输入的select | 旧一篇: Access错误提示之"Selected collating sequence not supported by the operating system."

  闲话:写Blog。对我这种懒人来说,简直就是...没事找事作,有空不如去睡觉,不过,脱离公司后一直忙于写程序终于发现了Blog的作用,另一个记录东西的硬盘,哈哈,要找以前的资料直接到自己的Blog里找就行了,不错呢,今天决定了。以后不定时的更新Blog,作为记录用。

  正文:今天记录正则表达式的正负向预查使。
  一个问题一时困扰着我,从以前练手写ASP的语法分析器,到后来帮朋友的采集器(小偷来着)就是:“.*?script.*?”是匹配一行中有script的字符串,而想匹配一行中没有script的字符串又怎么作呢?“.*?[^script].*?”?明显不行。[^]是不包含里面的每个字符。也就是只要行里不包含有s、c、r、i、p、t都能匹配。这个自然不是我想要的。
  突然想到,这两天群天太安静了,静得有点无聊,上去问问那些潜水高手们。很快得到指点,用“?!”,当时我楞了一下。“?!”是什么..查Vbscript手册,没有这玩意。突然想起我的网文捕快里有一篇微软的正则表达式简介。
  经查。“?!”叫“负向预查”(正是本文的主角之一),以下引用微软公司的正式介绍:

(?!pattern) 负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows(?!95|98|NT|2000)' 能匹配Windows 3.1" 中的 "Windows"但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

  而这位“负向预查”使还有一位兄弟“正向预查”使,"(?=)",以下是微软公司对其的正式介绍信:

(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配"Windows 2000"中的"Windows",但不能匹配"Windows3 .1"中"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

  从上面的字面上看"?!"和"?="组合中的()起不到普通()的标记子表达式的作用,他们只是为了配合"?!"和"?="指定范围而出现的,如果要将匹配结果标记成子表达式存放到Matches(vbscript的正则集合)内的话需要在外向再加一层()。
  说了这么多,回到刚刚开始的例子。“.*?script.*?”是匹配一行中包含有script的字符串,那么其反意正则表达式就是:“.*?(?!script).*”匹配一行中不包含有script的字符串。
  小小提醒,在测试这个正则时我写了一个正则“\n(?!script)*\n”居然会让我的IIS卡死,CPU100%。必须重启IIS才能恢复。原因不知,但请大家留意了。

  闲话:欢迎各位有手机的朋友到我的“海鱼手机加瓦站(http://wwww.fishjava.com)”来转转,有不少的免费的手机游戏和图片提供给各位,不但可以在线试玩游戏,直接通过WAP下载游戏和图片,还能自己上传一些好玩的游戏或图片上来大家一起来玩。

发表于 @ 2005年12月04日 22:34:00|评论(loading...)|编辑

新一篇: [HTML]下拉输入框--能输入的select | 旧一篇: Access错误提示之"Selected collating sequence not supported by the operating system."

评论

#wangzx 发表于2005-12-06 11:15:00  IP: 218.19.174.*
不知道到底有哪些RE引擎支持?
#Robbie Mosaic 发表于2005-12-06 15:49:00  IP: 211.167.159.*
(?!script)* 有一个括号还有一个 *,似乎是会比较慢的。另外,这是预查,是不是能加 * 还是个问题,不是说“预查不消耗字符”嘛。
#布丁龙 发表于2005-12-06 13:17:00  IP: 220.179.167.*
这个不太了解,不过,至少我在javascript和vbscript内测试通过。应该可以用吧。
#中国搜 发表于2005-12-06 23:35:00  IP: 61.150.109.*
正则表达式库 可以搜索各种版本的正则表达式 可在线测试正则表达式
http://www.zhongguosou.com/computer_question_tools/regular_expression.html
发表评论  


登录
Csdn Blog version 3.1a
Copyright © 布丁龙