用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
laily的公告
<ul> <li>Home:<a href="http://www.9499.net" targer="_blank">www.9499.net</a></li> <li>Email:A at Lai.Com.Cn</li> <li>QQ:3959809</li> </ul> <h3>Google ADS</h3> <div> <script type="text/javascript"><!-- google_ad_client = "pub-7149664582144625"; google_ad_width = 200; google_ad_height = 90; google_ad_format = "200x90_0ads_al"; google_ad_channel =""; google_color_border = "336699"; google_color_bg = "FFFFFF"; google_color_link = "0000FF"; google_color_url = "008000"; google_color_text = "000000"; //--></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> </div> <div style="width:100%;text-align:center;"> <h3>摄影展台</h3> <img src="" id="photoShow" style="width:100%;height:;cursor:hand;" onerror="//"> <script> try{ //摄影展台 var a=[['r_4legsnake','4444'],['r_P1080481','4446'],['r__P1080694','4442'],['r_laicom_1088086488','4443'],['r_P1050503','4445'],['r_P1050437','4450'],['r_P1050131','4451'],['r_P1030162','5392'],['r_P1000809','5396'],['r_P1030320','5397'],['r_P1020942','5398'],['r_P1080766','4455'],['r_P1100419','10798']]; var i=Math.floor(a.length*Math.random()); document.all.photoShow.src='http://blog.csdn.net/images/blog_csdn_net/laily/25040/'+a[i][0]+'.jpg'; document.all.photoShow.onclick=function(){self.location='http://blog.csdn.net/laily/gallery/image/'+a[i][1]+'.aspx';} } catch(e){;} </script> <h3>Utilities</h3> <div style="background-image:url('http://blog.csdn.net/images/blog_csdn_net/laily/17459/o_bline.gif');"> <div style="height:132;overflow:hidden;"> <embed src="http://www.clocklink.com/Clocks/0001-green.swf?TimeZone=CCT" width="150" height="150" _style="position:absolute;z-index:2;top:85;left:133;" wmode="transparent" type="application/x-shockwave-flash"> </div> 总计数:<img src=http://nmc2.jy.js.cn/cgi-bin/counter.pl?id=laicomblog&md=a48&ln=8&from=0&bd=$0;$0;$255> <br> 当前页:<img src="" id="PageView"><br> <img src="" id="TotalView" style="display:none"> <INPUT TYPE=text id=txtQ size=12><IMG SRC="http://www.google.com/logos/Logo_25wht.gif" border="0" ALT="Google搜索" align="absmiddle" onclick="self.open('http://www.google.com/search?&hl=zh-CN&q='+txtQ.value,'goog');"><br> <!-- <INPUT TYPE=text id=txtBaidu size=12><IMG SRC="http://img.baidu.com/search/img/baidulogo_clarity_80_29.gif" border="0" ALT="百度搜索" align="bottom" onclick="self.open('http://www.baidu.com/baidu?ie=utf-8&word='+txtBaidu.value,'baidu');"> --> <br> <embed id="olplayer" AutoStart="false" loop="false" style="width:100%;height:45" src="http://guoxin.lai.googlepages.com/mp3.asx" /> </div> </div> <script> //设置两个计数计的外观样式,取值1-60 var PageCountStyle=48 var TotalCountStyle=48 try{ var sUrl=self.location.href var re=new RegExp("(.+\.net\/)([^\/]+)([^\.]*)","ig") if(re.test(sUrl)) { var blog_id=RegExp.$2; var page_id=blog_id+"__"+RegExp.$3.replace(/\//g,""); blog_id+="__CSDNBLOG" var cUrl="http://nmc2.jy.js.cn/cgi-bin/counter.pl?ln=8&bd=$0;$0;$255&from=0" document.all.PageView.src=cUrl+"&id="+page_id+"&md=a"+PageCountStyle document.all.TotalView.src=cUrl+"&id="+blog_id+"&md=a"+TotalCountStyle } }catch(e){;} </script> <span style="display:none"> <a href="http://guoxin.lai.googlepages.com/">9499.net</a> </span> <!-- <div align="center" id="adFrame" style="position:absolute;"> <h3 id="adButton">Google ADS [点击隐藏/显示]</h3> <div id="adBody"> <script type="text/javascript"> google_ad_client = "pub-7149664582144625"; google_ad_width = 468; google_ad_height = 60; google_ad_format = "468x60_as"; google_ad_channel =""; google_ad_type = "text_image"; google_page_url = document.location; google_ad_channel ="6155434076"; </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> </div> </div> <script language="javascript"> var adWidth=468 var adHeight=85 adFrame.style.pixelLeft=document.body.clientWidth-adWidth adFrame.style.pixelTop=document.body.clientHeight-adHeight; adFrame.style.pixelWidth=adWidth adBody.style.display="block" adBody.style.display="block" adButton.onmouseup=function() { setTimeout('adHeight=(adBody.style.display=="none") ? 25 : 85;window.onresize();',500) } document.body.onscroll=window.onresize=function() { adFrame.style.pixelLeft=document.body.clientWidth-adWidth; adFrame.style.pixelTop=document.body.clientHeight-adHeight+document.body.scrollTop; } </script> --> <SCRIPT language=javascript> document.body.onload=function() { try{ var imgUp=new Image() var imgDown=new Image() imgUp.src="http://blog.csdn.net/images/blog_csdn_net/laily/17459/o_minus.gif" imgDown.src="http://blog.csdn.net/images/blog_csdn_net/laily/17459/o_plus.gif" var h3=document.getElementsByTagName("h3") for(var i=0;i<h3.length;i++) { if(h3[i].sourceIndex>rightmenu.nextSibling.sourceIndex)break var img=new Image() img.src=imgUp.src h3[i].insertAdjacentElement("afterBegin",img) h3[i].onclick=function() { var ul=this.nextSibling var img=document.all[this.sourceIndex+1] ul.style.display=(ul.style.display=="none")?"block":"none" img.src=(ul.style.display=="none")?imgDown.src:imgUp.src } if(h3[i].nextSibling.tagName.toLowerCase()!="ul")continue //添加控制导航栏收缩/展开的按钮 var btn=document.createElement('span'); document.body.insertAdjacentElement('beforeEnd',btn); btn.style.cssText='position:absolute;display:block;top:22;left:2;width:110;height:20;color:blue;background:yellow;border:2 outset;cursor:hand;'; btn.innerText='<<收回导航栏'; btn.onclick=function() { var isHide=(rightmenu.style.display=='none'); rightmenu.style.display=isHide?'block':'none'; btn.innerText=isHide?'<<收回导航栏':'展开导航栏>>'; } var mc=new alai_menu_bar1(document.all.tagline) //建立导航菜单 var mnu=new alai_menu_xp(260) var items=h3[i].nextSibling.children if(items==null)continue for(var j=0;j<items.length;j++) { var item=items[j].childNodes[0] if(item==null)continue if(typeof(item.innerText)=="undefined" || typeof(item.href)=="undefined")continue if(item.target=="")item.target="_self" mnu.addLink(item.href,item.innerText,item.target,"http://guoxin.lai.googlepages.com/html.gif") } if(mnu.item.length>0)mc.add(h3[i].innerText,mnu) } h3[0].click(); h3[1].click(); } catch(e){} } </SCRIPT> <SCRIPT language=javascript src="http://guoxin.lai.googlepages.com/alai_menu_xp.js"></script>
文章分类
BLOG专栏推荐
_★ 申请加入★
Afei的专栏
coollzh(RSS)
Dream .Net Blog(RSS)
driftingice的专栏(RSS)
griefforyou的程序人生(RSS)
Min.Dom(RSS)
mmkk's weblog
孟子E章的专栏(RSS)
拼搏之路(RSS)
晒太阳的草
最爱白菜(RSS)
活靶子.Net(RSS)
灵感之源(RSS)
精彩秋季 精彩.net(RSS)
翱翔.Net Blog(RSS)
键者天行(RSS)
阿好空间(RSS)
国欣网络
Mypoco主页
国欣网络社区
国欣网络首页
广发证券云浮营业部网站
我的数码相册
我的留言簿
阿赖Jscript控件程序及教程
开发论坛的发贴
[CSDN]做过WEB控件的朋友帮我看看问题出在哪里
[CSDN]问题讨论:如何让javascript边运行边输出到浏览器,而不是运行完才输出?
热门文章
1.轻轻松松创建目录树菜单
2.ASP.NET动态生成网页图片
3.经典正则表达式
N-Gage使用技巧及问题解决之道
S60手机PC无线遥控器!
VBScript与正则表达式
在N-Gage上折腾一个Hello World程序
小程序大作为,JS工具脚本
搞笑,安全套广告语大全
新欢乐时光病毒源码分析
跟我玩转CSDN BLOG界面
酷!用VB/VB.NET开发各种智能手机应用
面向对象的jscript目录树程序
网址收藏
ASPCOOL Blog
Code Project
CSDN社区
DotNet博客
MSDN
博客园
博客堂
微软高校信息交流中心
无忧脚本
百度搜索
我的摄影贴
FZ1随机软件做的全景图
二千多年的深思
我的FZ1生态摄影
暴风雨后的生态园
存档

原创  微软的正则表达式教程(四):限定符和定位符 收藏

限定符

有时候不知道要匹配多少字符。为了能适应这种不确定性,正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。

下表给出了各种限定符及其含义的说明:

字符 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{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} mn 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。刘, "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

对一个很大的输入文档而言,章节数很轻易就超过九章,因此需要有一种方法来处理两位数或者三位数的章节号。限定符就提供了这个功能。下面的JScript 正则表达式可以匹配具有任何位数的章节标题:

/Chapter [1-9][0-9]*/

下面的 VBScript 正则表达式执行同样的匹配:

"Chapter [1-9][0-9]*"

请注意限定符出现在范围表达式之后。因此,它将应用于所包含的整个范围表达式,在本例中,只指定了从 0 到 9 的数字。

这里没有使用 '+' 限定符,因为第二位或后续位置上并不一定需要一个数字。同样也没有使用 '?' 字符,因为这将把章节数限制为只有两位数字。在 'Chapter' 和空格字符之后至少要匹配一个数字。

如果已知章节数限制只有99 章,则可以使用下面的 JScript 表达式来指定至少有一位数字,但不超过两个数字。

/Chapter [0-9]{1,2}/

对 VBScript 可以使用下述正则表达式:

"Chapter [0-9]{1,2}"

上述表达式的缺点是如果有一个章节号大于 99,它仍只会匹配前两位数字。另一个缺点是某些人可以创建一个 Chapter 0,而且仍能匹配。一个更好的用来匹配两位数的 JScript 表达式如下:

/Chapter [1-9][0-9]?/

或者

/Chapter [1-9][0-9]{0,1}/

对 VBScript 而言,下述表达式与上面等价:

"Chapter [1-9][0-9]?"

或者

"Chapter [1-9][0-9]{0,1}"

'*'、 '+'和 '?' 限定符都称之为贪婪的,也就是说,他们尽可能多地匹配文字。有时这根本就不是所希望发生的情况。有时则正好希望最小匹配。

例如,你可能要搜索一个 HTML 文档来查找一处包含在 H1 标记中的章节标题。在文档中该文字可能具有如下形式:

<H1>Chapter 1 – Introduction to Regular Expressions</H1>

下面的表达式匹配从开始的小于号 (<) 到 H1 标记结束处的大于号之间的所有内容。

/<.*>/

 VBScript 的正则表达式为:

"<.*>"

如果所要匹配的就是开始的 H1 标记,则下述非贪婪地表达式就只匹配 <H1>。

/<.*?>/

或者

"<.*?>"

通过在 '*'、 '+' 或 '?' 限定符后放置 '?',该表达式就从贪婪匹配转为了非贪婪或最小匹配。

 

定位符

到现在为止,所看到的示例都只考虑查找任何地方出现的章节标题。出现的任何一个字符串 'Chapter' 后跟一个空格和一个数字可能是一个真正的章节标题,也可能是对其他章节的交叉引用。由于真正的章节标题总是出现在一行的开始,因此需要设计一个方法只查找标题而不查找交叉引用。

定位符提供了这个功能。定位符可以将一个正则表达式固定在一行的开始或结束。也可以创建只在单词内或只在单词的开始或结尾处出现的正则表达式。下表包含了正则表达式及其含义的列表:

字符 描述
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。
\B 匹配非单词边界。

不能对定位符使用限定符。因为在一个换行符或者单词边界的前面或后面不会有连续多个位置,因此诸如 '^*' 的表达式是不允许的。

要匹配一行文字开始位置的文字,请在正则表达式的开始处使用 '^' 字符。不要把 '^' 的这个语法与其在括号表达式中的语法弄混。它们的语法根本不同。

要匹配一行文字结束位置的文字,请在正则表达式的结束处使用 '$' 字符。

要在查找章节标题时使用定位符,下面的 JScript 正则表达式将匹配位于一行的开始处最多有两个数字的章节标题:

/^Chapter [1-9][0-9]{0,1}/

VBScript 中相同功能的正则表达式如下:

"^Chapter [1-9][0-9]{0,1}"

一个真正的章节标题不仅出现在一行的开始,而且这一行中也仅有这一个内容,因此,它必然也位于一行的结束。下面的表达式确保所指定的匹配只匹配章节而不会匹配交叉引用。它是通过创建一个只匹配一行文字的开始和结束位置的正则表达式来实现的。

/^Chapter [1-9][0-9]{0,1}$/

对 VBScript 则使用:

"^Chapter [1-9][0-9]{0,1}$"

匹配单词边界有少许不同,但却给正则表达式增加了一个非常重要的功能。单词边界就是单词和空格之间的位置。非单词边界就是其他任何位置。下面的 JScript 表达式将匹配单词 'Chapter' 的前三个字符,因为它们出现在单词边界后:

/\bCha/

对 VBScript 为:

"\bCha"

这里 '\b' 操作符的位置很关键。如果它位于要匹配的字符串的开始,则将查找位于单词开头处的匹配;如果它位于改字符串的末尾,则查找位于单词结束处的匹配。例如,下面的表达式将匹配单词 'Chapter' 中的 'ter',因为它出现在单词边界之前:

/ter\b/

以及

"ter\b"

下面的表达式将匹配 'apt',因为它位于 'Chapter' 中间,但不会匹配 'aptitude' 中的'apt':

/\Bapt/

以及

"\Bapt"

这是因为在单词 'Chapter' 中 'apt' 出现在非单词边界位置,而在单词 'aptitude' 中位于单词边界位置。非单词边界操作符的位置不重要,因为匹配与一个单词的开头或结尾无关。

发表于 @ 2004年06月30日 14:03:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:微软的正则表达式教程(三):字符匹配 | 新一篇:微软的正则表达式教程(五):选择/编组和后向引用

  • 发表评论
  • 评论内容:
  •  
Copyright © laily
Powered by CSDN Blog