﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-【永恒的瞬间】  -文章分类-常用正则表达式 </title><link>http://www.blogjava.net/19851985lili/category/19189.html</link><description>☜GivE mE HapPy ☞




</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 15:58:23 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 15:58:23 GMT</pubDate><ttl>60</ttl><item><title>javascript 常用验证 </title><link>http://www.blogjava.net/19851985lili/articles/100548.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Sun, 25 Feb 2007 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/100548.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/100548.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/100548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/100548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/100548.html</trackback:ping><description><![CDATA[、验证类<br />1、数字验证内<br />1.1 整数<br />1.2 大于0的整数 （用于传来的ID的验证)<br />1.3 负整数的验证<br />1.4 整数不能大于iMax<br />1.5 整数不能小于iMin<br />2、时间类<br />2.1 短时间，形如 (13:04:06)<br />2.2 短日期，形如 (2003-12-05)<br />2.3 长时间，形如 (2003-12-05 13:04:06)<br />2.4 只有年和月。形如(2003-05,或者2003-5)<br />2.5 只有小时和分钟,形如(12:03)<br />3、表单类<br />3.1 所有的表单的值都不能为空<br />3.2 多行文本框的值不能为空。<br />3.3 多行文本框的值不能超过sMaxStrleng<br />3.4 多行文本框的值不能少于sMixStrleng<br />3.5 判断单选框是否选择。<br />3.6 判断复选框是否选择.<br />3.7 复选框的全选，多选，全不选，反选<br />3.8 文件上传过程中判断文件类型<br />4、字符类<br />4.1 判断字符全部由a-Z或者是A-Z的字字母组成<br />4.2 判断字符由字母和数字组成。<br />4.3 判断字符由字母和数字，下划线,点号组成.且开头的只能是下划线和字母<br />4.4 字符串替换函数.Replace();<br />5、浏览器类<br />5.1 判断浏览器的类型<br />5.2 判断ie的版本<br />5.3 判断客户端的分辨率
<p>6、结合类<br />6.1 email的判断。<br />6.2 手机号码的验证<br />6.3 身份证的验证</p><p><br />二、功能类</p><p>1、时间与相关控件类<br />1.1 日历<br />1.2 时间控件<br />1.3 万年历<br />1.4 显示动态显示时钟效果（文本，如OA中时间）<br />1.5 显示动态显示时钟效果 (图像，像手表) <br />2、表单类<br />2.1 自动生成表单<br />2.2 动态添加，修改，删除下拉框中的元素<br />2.3 可以输入内容的下拉框<br />2.4 多行文本框中只能输入iMax文字。如果多输入了，自动减少到iMax个文字（多用于短信发送)</p><p>3、打印类<br />3.1 打印控件<br />4、事件类<br />4.1 屏蔽右键<br />4.2 屏蔽所有功能键<br />4.3 --&gt; 和&lt;-- F5 F11,F9,F1<br />4.4 屏蔽组合键ctrl+N<br />5、网页设计类<br />5.1 连续滚动的文字，图片（注意是连续的，两段文字和图片中没有空白出现）<br />5.2 html编辑控件类<br />5.3 颜色选取框控件<br />5.4 下拉菜单<br />5.5 两层或多层次的下拉菜单<br />5.6 仿IE菜单的按钮。（效果如rongshuxa.com的导航栏目)<br />5.7 状态栏，title栏的动态效果（例子很多，可以研究一下）<br />5.8 双击后，网页自动滚屏<br />6、树型结构。<br />6.1 asp+SQL版<br />6.2 asp+xml+sql版<br />6.3 java+sql或者java+sql+xml<br />7、无边框效果的制作<br />8、连动下拉框技术<br />9、文本排序<br />---------------------------------------------------------------------------------------</p><p>一、验证类<br />1、数字验证内<br />1.1 整数<br />/^(-|\+)?\d+$/.test(str)<br />1.2 大于0的整数 （用于传来的ID的验证)<br />/^\d+$/.test(str)<br />1.3 负整数的验证<br />/^-\d+$/.test(str)<br />2、时间类<br />2.1 短时间，形如 (13:04:06)<br />function isTime(str)<br />{<br />var a = str.match(/^(\d{1,2})(?(\d{1,2})\2(\d{1,2})$/);<br />if (a == null) {alert('输入的参数不是时间格式'); return false;}<br />if (a[1]&gt;24 || a[3]&gt;60 || a[4]&gt;60)<br />{<br />alert("时间格式不对");<br />return false<br />}<br />return true;<br />}<br />2.2 短日期，形如 (2003-12-05)<br />function strDateTime(str)<br />{<br />var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); <br />if(r==null)return false; <br />var d= new Date(r[1], r[3]-1, r[4]); <br />return (d.getFullYear()==r[1]&amp;&amp;(d.getMonth()+1)==r[3]&amp;&amp;d.getDate()==r[4]);<br />}<br />2.3 长时间，形如 (2003-12-05 13:04:06)<br />function strDateTime(str)<br />{<br />var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2})\d{1,2})\d{1,2})$/; <br />var r = str.match(reg); <br />if(r==null)return false; <br />var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]); <br />return (d.getFullYear()==r[1]&amp;&amp;(d.getMonth()+1)==r[3]&amp;&amp;d.getDate()==r[4]&amp;&amp;d.getHours()==r[5]&amp;&amp;d.getMinutes()==r[6]&amp;&amp;d.getSeconds()==r[7]);<br />}<br />2.4 只有年和月。形如(2003-05,或者2003-5)<br />2.5 只有小时和分钟,形如(12:03)<br />3、表单类<br />3.1 所有的表单的值都不能为空</p><p>3.2 多行文本框的值不能为空。<br />3.3 多行文本框的值不能超过sMaxStrleng<br />3.4 多行文本框的值不能少于sMixStrleng<br />3.5 判断单选框是否选择。<br />3.6 判断复选框是否选择.<br />3.7 复选框的全选，多选，全不选，反选<br />3.8 文件上传过程中判断文件类型<br />4、字符类<br />4.1 判断字符全部由a-Z或者是A-Z的字字母组成</p><p>4.2 判断字符由字母和数字组成。</p><p>4.3 判断字符由字母和数字，下划线,点号组成.且开头的只能是下划线和字母<br />/^([a-zA-z_]{1})([\w]*)$/g.test(str)<br />4.4 字符串替换函数.Replace();<br />5、浏览器类<br />5.1 判断浏览器的类型<br />window.navigator.appName<br />5.2 判断ie的版本<br />window.navigator.appVersion<br />5.3 判断客户端的分辨率<br />window.screen.height; window.screen.width;</p><p>6、结合类<br />6.1 email的判断。<br />function ismail(mail)<br />{<br />return(new RegExp(/^\w+((-\w+)|(\.\w+))*\-AT-[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(mail));<br />}<br />6.2 手机号码的验证<br />6.3 身份证的验证<br />function isIdCardNo(num)<br />{<br />if (isNaN(num)) {alert("输入的不是数字！"); return false;}<br />var len = num.length, re; <br />if (len == 15)<br />re = new RegExp(/^(\d{6})()?(\d{2})(\d{2})(\d{2})(\d{3})$/);<br />else if (len == 18)<br />re = new RegExp(/^(\d{6})()?(\d{4})(\d{2})(\d{2})(\d{3})(\d)$/);<br />else {alert("输入的数字位数不对！"); return false;}<br />var a = num.match(re);<br />if (a != null)<br />{<br />if (len==15)<br />{<br />var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);<br />var B = D.getYear()==a[3]&amp;&amp;(D.getMonth()+1)==a[4]&amp;&amp;D.getDate()==a[5];<br />}<br />else<br />{<br />var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);<br />var B = D.getFullYear()==a[3]&amp;&amp;(D.getMonth()+1)==a[4]&amp;&amp;D.getDate()==a[5];<br />}<br />if (!B) {alert("输入的身份证号 "+ a[0] +" 里出生日期不对！"); return false;}<br />}<br />return true;<br />}<br />-------------------------------------------------------------------------------------</p><p>3.7 复选框的全选，多选，全不选，反选</p><p>全选</p><p></p><p></p><p></p><p></p><p></p><p></p><p><br />全选</p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p>function checkAll(str)<br />{<br />var a = document.getElementsByName(str);<br />var n = a.length;<br />for (var i=0; ia[i].checked = window.event.srcElement.checked;<br />}<br />function checkItem(str)<br />{<br />var e = window.event.srcElement;<br />var all = eval("document.hrong."+ str);<br />if (e.checked)<br />{<br />var a = document.getElementsByName(e.name);<br />all.checked = true;<br />for (var i=0; i{<br />if (!a[i].checked){ all.checked = false; break;}<br />}<br />}<br />else all.checked = false;<br />}</p><p><br />3.8 文件上传过程中判断文件类型</p><p><br />-------------------------------------------------------------------------------------<br />１．身份证严格验证：</p><p></p><p>２．验证ＩＰ地址</p><p>function isip(s){<br />var check=function(v){try{return (v&lt;=255 &amp;&amp; v&gt;=0)}catch(x){return false}};<br />var re=s.split(".")<br />return (re.length==4)?(check(re[0]) &amp;&amp; check(re[1]) &amp;&amp; check(re[2]) &amp;&amp; check(re[3])):false<br />}</p><p>var s="202.197.78.129";<br />alert(isip(s))</p><p></p><p>３．加sp1后还能用的无边框窗口！！</p><p></p><p></p><p><br />/*--- Special Thanks For andot ---*/</p><p>/*<br />This following code are designed and writen by Windy_sk <br />You can use it freely, but u must held all the copyright items!<br />/</p><p>/- Thanks For andot Again ---*/</p><p>var CW_width = 400;<br />var CW_height = 300;<br />var CW_top = 100;<br />var CW_left = 100;<br />var CW_url = "/";<br />var New_CW = window.createPopup();<br />var CW_Body = New_CW.document.body;<br />var content = "";<br />var CSStext = "margin:1px;color:black; border:2px outset;border-style:expression(onmouseout=onmouseup=function(){this.style.borderStyle='outset'}, onmousedown=function(){if(event.button!=2)this.style.borderStyle='inset'});background-color:buttonface;width:16px;height:14px;font-size:12px;line-height:11px;cursor:Default;";</p><p>//Build Window<br />include.startDownload(CW_url, function(source){content=source});</p><p>function insert_content(){<br />var temp = "";<br />CW_Body.style.overflow = "hidden";<br />CW_Body.style.backgroundColor = "white";<br />CW_Body.style.border = "solid black 1px";<br />content = content.replace(/]*)&gt;/g,"");<br />temp += "";<br />temp += "";<br />temp += "Chromeless Window For IE6 SP1";<br />temp += "";<br />temp += "?";<br />temp += "0";<br />temp += "1";<br />temp += "x";<br />temp += "";<br />temp += "";<br />temp += content;<br />temp += "</p><p>";<br />temp += "";<br />CW_Body.innerHTML = temp;<br />}</p><p>setTimeout("insert_content()",1000);</p><p>var if_max = true;<br />function show_CW(){<br />window.moveTo(10000, 10000);<br />if(if_max){<br />New_CW.show(CW_top, CW_left, CW_width, CW_height);<br />if(typeof(New_CW.document.all.include)!="undefined"){<br />New_CW.document.all.include.style.width = CW_width;<br />New_CW.document.all.Max.innerText = "1";<br />}</p><p>}else{<br />New_CW.show(0, 0, screen.width, screen.height);<br />New_CW.document.all.include.style.width = screen.width;<br />}<br />}</p><p>window.onfocus = show_CW;<br />window.onresize = show_CW;</p><p>// Move Window<br />var drag_x,drag_y,draging=false</p><p>function drag_move(e){<br />if (draging){<br />New_CW.show(e.screenX-drag_x, e.screenY-drag_y, CW_width, CW_height);<br />return false;<br />}<br />}</p><p>function drag_down(e){<br />if(e.button==2)return;<br />if(New_CW.document.body.offsetWidth==screen.width &amp;&amp; New_CW.document.body.offsetHeight==screen.height)return;<br />drag_x=e.clientX;<br />drag_y=e.clientY;<br />draging=true;<br />e.srcElement.setCapture();<br />}</p><p>function drag_up(e){<br />draging=false;<br />e.srcElement.releaseCapture();<br />if(New_CW.document.body.offsetWidth==screen.width &amp;&amp; New_CW.document.body.offsetHeight==screen.height) return;<br />CW_top = e.screenX-drag_x;<br />CW_left = e.screenY-drag_y;<br />}</p><p><br />?<br />电话号码的验证</p><p>要求：<br />　　(1)电话号码由数字、"("、")"和"-"构成<br />　　(2)电话号码为3到8位<br />　　(3)如果电话号码中包含有区号，那么区号为三位或四位<br />　　(4)区号用"("、")"或"-"和其他部分隔开<br />　　(5)移动电话号码为11或12位，如果为12位,那么第一位为0<br />　　(6)11位移动电话号码的第一位和第二位为"13"<br />　　(7)12位移动电话号码的第二位和第三位为"13"<br />　　根据这几条规则，可以与出以下正则表达式：<br />　　(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)</p><p></p><p>function PhoneCheck(s) {<br />var str=s;<br />var reg=/(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/<br />alert(reg.test(str));<br />}</p><p></p><p>--------------------------------------------------------------------------------------</p><p><br />---------------------------------------------------------------------------------</p><p>//检验法人代码<br />function isCorporationCode(s){<br />var patrn=/^(\d){15}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验登录名：只能输入5-20个以字母开头、可带数字、“_”、“.”的字串<br />function isRegisterUserName(s)<br />{<br />var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}<br />//校验用户姓名：只能输入1-30个以字母开头的字串<br />function isTrueName(s)<br />{<br />var patrn=/^[^`~!@#$%^&amp;*()+-=|\\\[\]\{\}:;\'\,.&lt;&gt;/? 0-9]{2,19}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验密码：只能输入6-15个字母、数字<br />function isPasswd(s)<br />{<br />var patrn=/^[a-zA-Z0-9]{6,15}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//检验体重<br />function isAvoirdupois(s)<br />{<br />var patrn=/^[1-9]{1}[0-9]{0,2}$/;<br />var patrn2=/^[1-9]{1}$/;<br />var intPart=s.indexOf('.');<br />var decPart=s.lastIndexOf('.');<br />if (intPart==-1 &amp;&amp; patrn.exec(s) &amp;&amp; eval(s)&gt;=2 &amp;&amp; eval(s)&lt;=200) return true<br />if (intPart!=decPart || intPart==0 || intPart+2!=s.length) return false<br />if (!patrn.exec(s.substring(0,intPart)) || !patrn2.exec(s.substring(decPart+1))) return false<br />if (eval(s)&lt;2 || eval(s)&gt;200) return false<br />return true<br />}</p><p>//校验普通电话、传真号码：可以“+”开头，除数字外，可含有“-”<br />function isTel(s)<br />{<br />var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验手机号码：必须以数字开头，除数字外，可含有“-”<br />function isMobile(s)<br />{<br />var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验地区代码<br />function isAreaCode(s)<br />{<br />var patrn=/^(\d){6}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验邮政编码<br />function isPostalCode(s)<br />{<br />var patrn=/^[1-9]{1}(\d){5}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验搜索关键字<br />function isSearch(s)<br />{<br />var patrn=/^[^`~!@#$%^&amp;*()+=|\\\[\]\{\}:;\'\,.&lt;&gt;/? ]{1}[^`~!@$%^&amp;()+=|\\\[\]\{\}:;\'\,.&lt;&gt;?]{0,19}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验是否为ip地址<br />function isIP(s)<br />{<br />var patrn=/^[0-9.]{1,20}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//检验页码是否正确<br />function isPage(s)<br />{<br />var patrn=/^[1-9]{1}[0-9]{0,2}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//表单输入值错误提示<br />function vErr(o,s){<br />alert(s);<br />if (o) o.focus();<br />return false;<br />}</p><p>//判断单选<br />function chkRadio(o){<br />for (i=0;iif (o[i].checked) return true;<br />}<br />return false;<br />} <br />//====================================表单类================================<br />// 文件上传过程中判断文件类型<br />/*</p><p>/</p><p>//表单的值不能为空<br />function isNull(elem){<br />//var pattern=/^\s+|\s+$/;<br />if(elem.replace(/(^\s+|\s$)/g, "")==""){<br />return false;<br />}else{<br />return true;<br />}<br />}<br />//不能超过imax字符<br />function imax(elem){<br />if(elem.length&gt;imax){<br />return false;<br />}else{<br />return true;<br />}<br />}<br />//不能少于imix字符<br />function imix(elem){<br />if(elem.lengthreturn false;<br />}else{<br />return true;<br />}<br />}<br />//输入为中文判断<br />function isChinese(elem){<br />var pattern=/[^\x00-\xff]/g;<br />if(pattern.test(elem)){<br />//包含中文<br />return false;<br />}else{<br />//不包含中文<br />return true;<br />}<br />}</p><p>/ *********************************************************************************************************************</p><p></p><p></p><p></p><p>.cMenu {<br />FILTER: alpha(opacity=0);BACKGROUND-COLOR: #D6D3CE;BORDER-BOTTOM: #666666 2px solid; BORDER-LEFT: #E4E4E4 2px solid; BORDER-RIGHT: #666666 2px solid; BORDER-TOP: #E4E4E4 2px solid; COLOR: #000000; CURSOR: default; FONT-SIZE: 9pt; color:#000000;FONT-WEIGHT: normal; LINE-HEIGHT: 20px; POSITION: absolute; VISIBILITY: hidden; WIDTH: 110px<br />}<br />.menuitems {<br />font-size:9pt;<br />MARGIN: 2px;<br />PADDING-BOTTOM: 0px;<br />PADDING-LEFT: 15px;<br />PADDING-RIGHT: 3px;<br />PADDING-TOP: 0px;<br />}</p><p></p><p></p><p></p><p>&lt;!--[if IE]&gt;<br />onmouseover=highlightie5()&gt;</p><p>电话号码的验证</p><p>要求：<br />　　(1)电话号码由数字、"("、")"和"-"构成<br />　　(2)电话号码为3到8位<br />　　(3)如果电话号码中包含有区号，那么区号为三位或四位<br />　　(4)区号用"("、")"或"-"和其他部分隔开<br />　　(5)移动电话号码为11或12位，如果为12位,那么第一位为0<br />　　(6)11位移动电话号码的第一位和第二位为"13"<br />　　(7)12位移动电话号码的第二位和第三位为"13"<br />　　根据这几条规则，可以与出以下正则表达式：<br />　　(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)</p><p><br />&lt;script language="javascript"&gt;<br />function PhoneCheck(s) {<br />var str=s;<br />var reg=/(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/<br />alert(reg.test(str));<br />}<br />&lt;/script&gt;<br />&lt;input type=text name="iphone"&gt;<br />&lt;input type=button onclick="PhoneCheck(document.all.iphone.value)" value="Check"&gt;<br />----------------------------------------------------------------------------------------</p><p>&lt;%<br />'********************************************<br />'函数功能：正则表达式校验<br />'参数patrn：要校验的类型<br />' "User" - 用户名<br />' "Truename" - 英文姓名<br />' "Passwd" - 密码<br />' "Tel" - 电话/传真<br />' "Mobil" - 手机<br />' "Date" - 日期（格式：yyyy-mm-dd）<br />' "Email" - 电子邮件<br />' "Postalcode" - 邮政编码<br />' "Search" - 搜索关键字<br />' "Int" - 整数<br />'参数strng：要校验的字串<br />'返回值：校验结果，正确返回true，错误返回false<br />'********************************************<br />Function IsVerify(patrn,strng)<br />strng=Trim(strng)<br />Select Case patrn<br />Case "User" '用户名<br />patrn="^[a-z]{1}([a-z0-9]|[._]){2,19}$"<br />Case "Truename" '英文姓名<br />patrn="^[a-zA-Z]{1,30}$"<br />Case "Passwd" '密码<br />patrn="^(\w){6,20}$"<br />Case "Tel" '电话/传真<br />patrn="^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$"<br />Case "Mobil" '手机<br />patrn="^(\d)+[-]?(\d){6,12}$"<br />Case "Date" '日期（格式：yyyy-mm-dd）<br />patrn="^[12]{1}(\d){3}[-][01]?(\d){1}[-][0123]?(\d){1}$"<br />Case "Email" '电子邮件<br />patrn="^((\w)|[-]|[.])+@(((\w)|[-])+[.])+[a-z]{2,4}$"<br />Case "Postalcode" '邮政编码<br />patrn="^[a-z0-9 ]{3,12}$"<br />Case "Search" '搜索关键字<br />patrn="^[^`~!@#$%^&amp;*()+=|\\\[\]\{\}:;\'\,.&lt;&gt;/?]{1}[^`~!@$%^&amp;()+=|\\\[\]\{\}:;\'\,.&lt;&gt;?]{0,19}$"<br />Case "Int" '整数<br />patrn="^[1-9]{1}[0-9]{0,6}$"<br />Case "Array"<br />patrn="^[0-9]{1}([0-9]|[\,]){0,150}$"<br />End Select<br />Dim regEx<br />Dim Match<br />Set regEx = New RegExp<br />regEx.Pattern = patrn<br />regEx.IgnoreCase = True<br />regEx.Global = True<br />Matches = regEx.test(strng)<br />IsVerify = Matches<br />Set regEx = Nothing<br />End Function</p><p>'********************************************<br />'函数功能：对输入框的特殊字串进行过滤保存<br />'参数strPass：过滤前的字符串<br />'返回值：过滤后的字符串<br />'********************************************<br />Function SQLencode(byVal strPass)<br />strPass = Replace(strPass, "&amp;", "&amp;")<br />strPass = Replace(strPass, "&lt;", "&lt;")<br />strPass = Replace(strPass, "&gt;", "&gt;")<br />strPass = Replace(strPass, """", """)<br />strPass = Replace(strPass, "'", "'")<br />strPass = Replace(strPass, " ", "　")<br />strPass = Replace(strPass,chr(13)&amp;chr(10),"&lt;br/&gt;")<br />SQLencode = strPass<br />End Function</p><p>'********************************************<br />'函数功能：对SQLencode函数过滤后的字符串进行还原<br />'参数strPass：经过过滤后的字符串<br />'返回值：还原的过滤前的字符串<br />'********************************************<br />Function SQLdecode(byVal strPass)<br />If Not isNull(strPass) Then<br />strPass = Replace(strPass, "&lt;", "&lt;")<br />strPass = Replace(strPass, "&gt;", "&gt;")<br />strPass = Replace(strPass, ""","""" )<br />strPass = Replace(strPass, "'","'" )<br />strPass = Replace(strPass,"&lt;br/&gt;",chr(13)&amp;chr(10))<br />End If<br />SQLdecode = strPass<br />End Function</p><p>'********************************************<br />'函数功能：生成随机密码（字符为数字与大小写字母集合）<br />'参数length：密码长度<br />'返回值：随机密码<br />'********************************************<br />Function random(length)<br />Dim n,str<br />rnds=""<br />Randomize<br />For i=1 To length<br />n=Int(75*Rnd+48)<br />If (n&gt;57 and n&lt;65) Or (n&gt;90 and n&lt;97) Then<br />i=i-1<br />Else<br />rnds=rnds&amp;Chr(n)<br />End If<br />Next<br />random=rnds<br />End Function</p><p>'********************************************<br />'函数功能：对密码进行加密/解密（最大长度为15位）<br />'********************************************<br />Function Encrypt(preString)<br />Dim pwds,s<br />pwds=""<br />s=Left(preString,15)<br />For i=1 To Len(s)<br />seed=170-Asc(Mid(s,i,1))-i<br />pwds=pwds &amp; Chr(seed)<br />Next<br />Encrypt=pwds<br />End Function</p><p>'********************************************<br />'函数功能：格式化当前时间字串<br />'参数：无<br />'返回值：返回当前时间的纯数字字符串方式的表示（例如：当前时间2001-10-3 2:34:6，返回字符串"20011003023406"）<br />'********************************************<br />Function TheDate()<br />y=year(date())<br />m=month(date())<br />d=day(date())<br />h=Hour(time())<br />n=Minute(time())<br />s=Second(time())<br />If Len(m)=1 Then m="0"&amp;m<br />If Len(d)=1 Then d="0"&amp;d<br />If Len(h)=1 Then h="0"&amp;h<br />If Len(n)=1 Then n="0"&amp;n<br />If Len(s)=1 Then s="0"&amp;s<br />thedate=y&amp;m&amp;d&amp;h&amp;n&amp;s<br />End Function</p><p>'********************************************<br />'函数功能：返回字符串的长度<br />'参数：字符串<br />'返回值：字符串长度<br />'********************************************<br />Function strLen(str)<br />dim p_len<br />p_len=0<br />strlen=0<br />if trim(str)&lt;&gt;"" then<br />p_len=len(trim(str))<br />for xx=1 to p_len<br />if asc(mid(str,xx,1))&lt;0 then<br />strlen=int(strlen) + 2<br />else<br />strlen=int(strlen) + 1<br />end if<br />next<br />end if<br />End Function</p><p>'********************************************<br />'函数功能：发送邮件通知<br />'参数：字符串<br />'返回值：成功/失败<br />'********************************************<br />Function SendMail(ToAddress, Subject, Body)<br />On Error Resume Next<br />Set objMail = Server.CreateObject("JMail.Message")<br />objMail.From = ADR_Email<br />objMail.FromName = "ADR管理中心"<br />objMail.Subject = Subject<br />objMail.AddRecipient ToAddress<br />objMail.Body = Body<br />If objMail.Send("") Then<br />SendMail = True<br />Else<br />SendMail = False<br />End If<br />If Err.Number&lt;&gt; 0 Then SendMail = False<br />Set objMail = Nothing<br />On Error Goto 0<br />End Function<br />%&gt;<br />-----------------------------------------------------------------------------------</p><p>//检验法人代码<br />function isCorporationCode(s){<br />var patrn=/^(\d){15}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验登录名：只能输入5-20个以字母开头、可带数字、“_”、“.”的字串<br />function isRegisterUserName(s)<br />{<br />var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}<br />//校验用户姓名：只能输入1-30个以字母开头的字串<br />function isTrueName(s)<br />{<br />var patrn=/^[^`~!@#$%^&amp;*()+-=|\\\[\]\{\}:;\'\,.&lt;&gt;/? 0-9]{2,19}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验密码：只能输入6-15个字母、数字<br />function isPasswd(s)<br />{<br />var patrn=/^[a-zA-Z0-9]{6,15}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//检验体重<br />function isAvoirdupois(s)<br />{<br />var patrn=/^[1-9]{1}[0-9]{0,2}$/;<br />var patrn2=/^[1-9]{1}$/;<br />var intPart=s.indexOf('.');<br />var decPart=s.lastIndexOf('.');<br />if (intPart==-1 &amp;&amp; patrn.exec(s) &amp;&amp; eval(s)&gt;=2 &amp;&amp; eval(s)&lt;=200) return true<br />if (intPart!=decPart || intPart==0 || intPart+2!=s.length) return false<br />if (!patrn.exec(s.substring(0,intPart)) || !patrn2.exec(s.substring(decPart+1))) return false<br />if (eval(s)&lt;2 || eval(s)&gt;200) return false<br />return true<br />}</p><p>//校验普通电话、传真号码：可以“+”开头，除数字外，可含有“-”<br />function isTel(s)<br />{<br />var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验手机号码：必须以数字开头，除数字外，可含有“-”<br />function isMobile(s)<br />{<br />var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验地区代码<br />function isAreaCode(s)<br />{<br />var patrn=/^(\d){6}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验邮政编码<br />function isPostalCode(s)<br />{<br />var patrn=/^[1-9]{1}(\d){5}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验搜索关键字<br />function isSearch(s)<br />{<br />var patrn=/^[^`~!@#$%^&amp;*()+=|\\\[\]\{\}:;\'\,.&lt;&gt;/? ]{1}[^`~!@$%^&amp;()+=|\\\[\]\{\}:;\'\,.&lt;&gt;?]{0,19}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//校验是否为ip地址<br />function isIP(s)<br />{<br />var patrn=/^[0-9.]{1,20}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//检验页码是否正确<br />function isPage(s)<br />{<br />var patrn=/^[1-9]{1}[0-9]{0,2}$/;<br />if (!patrn.exec(s)) return false<br />return true<br />}</p><p>//表单输入值错误提示<br />function vErr(o,s){<br />alert(s);<br />if (o) o.focus();<br />return false;<br />}</p><p>//判断单选<br />function chkRadio(o){<br />for (i=0;i&lt;o.length;i++){<br />if (o[i].checked) return true;<br />}<br />return false;<br />} <br /></p><img src ="http://www.blogjava.net/19851985lili/aggbug/100548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-02-25 11:32 <a href="http://www.blogjava.net/19851985lili/articles/100548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用js代码集 </title><link>http://www.blogjava.net/19851985lili/articles/97651.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Fri, 02 Feb 2007 12:38:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/97651.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/97651.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/97651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/97651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/97651.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 只能是写限定的东西 代码如下: 　　ENTER键可以让光标移到下一个输入框 		&lt;		input onkeydown		=		"		if(event.keyCode==13)event.keyCode=9		"		 		&gt;																		　　只能是中文		&lt;		input onkeyup		=...&nbsp;&nbsp;<a href='http://www.blogjava.net/19851985lili/articles/97651.html'>阅读全文</a><img src ="http://www.blogjava.net/19851985lili/aggbug/97651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-02-02 20:38 <a href="http://www.blogjava.net/19851985lili/articles/97651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>揭开正则表达式的神秘面纱</title><link>http://www.blogjava.net/19851985lili/articles/97621.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Fri, 02 Feb 2007 11:41:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/97621.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/97621.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/97621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/97621.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/97621.html</trackback:ping><description><![CDATA[
		<p>
				<b>引言</b>
				<br />
				<br />    正则表达式（regular expression）描述了一种字符串匹配的模式，可以用来：（1）检查一个串中是否含有符合某个规则的子串，并且可以得到这个子串；（2）根据匹配规则对字符串进行灵活的替换操作。<br /><br />    正则表达式学习起来其实是很简单的，不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂，一方面是因为大多数的文档没有做到由浅入深地讲解，概念上没有注意先后顺序，给读者的理解带来困难；另一方面，各种引擎自带的文档一般都要介绍它特有的功能，然而这部分特有的功能并不是我们首先要理解的。<br /><br />    文章中的每一个举例，都可以点击进入到测试页面进行测试。闲话少说，开始。</p>
		<hr color="#fea089" size="1" />
		<p>
				<b>1. 正则表达式规则</b>
		</p>
		<p>
				<b>1.1 普通字符</b>
		</p>
		<p>    字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号，都是"普通字符"。表达式中的普通字符，在匹配一个字符串的时候，匹配与之相同的一个字符。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=c&amp;txt=abcde">举例1：表达式 "c"，在匹配字符串 "abcde" 时</a>，匹配结果是：成功；匹配到的内容是："c"；匹配到的位置是：开始于2，结束于3。（注：下标从0开始还是从1开始，因当前编程语言的不同而可能不同）<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=bcd&amp;txt=abcde">举例2：表达式 "bcd"，在匹配字符串 "abcde" 时</a>，匹配结果是：成功；匹配到的内容是："bcd"；匹配到的位置是：开始于1，结束于4。</p>
		<hr color="#fea089" size="1" />
		<p>
				<b>1.2 简单的转义字符</b>
		</p>
		<p>    一些不便书写的字符，采用在前面加 "\" 的方法。这些字符其实我们都已经熟知了。</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="70">
										<p>表达式</p>
								</td>
								<td>
										<p>可匹配</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\r, \n</p>
								</td>
								<td>
										<p>代表回车和换行符</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\t</p>
								</td>
								<td>
										<p>制表符</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\\</p>
								</td>
								<td>
										<p>代表 "\" 本身</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    还有其他一些在后边章节中有特殊用处的标点符号，在前面加 "\" 后，就代表该符号本身。比如：^, $ 都有特殊意义，如果要想匹配字符串中 "^" 和 "$" 字符，则表达式就需要写成 "\^" 和 "\$"。</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="66">
										<p>表达式</p>
								</td>
								<td>
										<p>可匹配</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\^</p>
								</td>
								<td>
										<p>匹配 ^ 符号本身</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\$</p>
								</td>
								<td>
										<p>匹配 $ 符号本身</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\.</p>
								</td>
								<td>
										<p>匹配小数点（.）本身</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    这些转义字符的匹配方法与 "普通字符" 是类似的。也是匹配与之相同的一个字符。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5C$d&amp;txt=abc$de">举例1：表达式 "\$d"，在匹配字符串 "abc$de" 时</a>，匹配结果是：成功；匹配到的内容是："$d"；匹配到的位置是：开始于3，结束于5。</p>
		<hr color="#fea089" size="1" />
		<p>
				<b>1.3 能够与 '多种字符' 匹配的表达式</b>
		</p>
		<p>    正则表达式中的一些表示方法，可以匹配 '多种字符' 其中的任意一个字符。比如，表达式 "\d" 可以匹配任意一个数字。虽然可以匹配其中任意字符，但是只能是一个，不是多个。这就好比玩扑克牌时候，大小王可以代替任意一张牌，但是只能代替一张牌。</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="66">
										<p>表达式</p>
								</td>
								<td>
										<p>可匹配</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\d</p>
								</td>
								<td>
										<p>任意一个数字，0~9 中的任意一个</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\w</p>
								</td>
								<td>
										<p>任意一个字母或数字或下划线，也就是 A~Z,a~z,0~9,_ 中任意一个</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\s</p>
								</td>
								<td>
										<p>包括空格、制表符、换页符等空白字符的其中任意一个</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>.</p>
								</td>
								<td>
										<p>小数点可以匹配除了换行符（\n）以外的任意一个字符</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cd%5Cd&amp;txt=abc123">举例1：表达式 "\d\d"，在匹配 "abc123" 时</a>，匹配的结果是：成功；匹配到的内容是："12"；匹配到的位置是：开始于3，结束于5。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=a.%5Cd&amp;txt=aaa100">举例2：表达式 "a.\d"，在匹配 "aaa100" 时</a>，匹配的结果是：成功；匹配到的内容是："aa1"；匹配到的位置是：开始于1，结束于4。</p>
		<hr color="#fea089" size="1" />
		<p>
				<b>1.4 自定义能够匹配 '多种字符' 的表达式</b>
		</p>
		<p>    使用方括号 [ ] 包含一系列字符，能够匹配其中任意一个字符。用 [^ ] 包含一系列字符，则能够匹配其中字符之外的任意一个字符。同样的道理，虽然可以匹配其中任意一个，但是只能是一个，不是多个。</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="80">
										<p>表达式</p>
								</td>
								<td>
										<p>可匹配</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>[ab5@]</p>
								</td>
								<td>
										<p>匹配 "a" 或 "b" 或 "5" 或 "@"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>[^abc]</p>
								</td>
								<td>
										<p>匹配 "a","b","c" 之外的任意一个字符</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>[f-k]</p>
								</td>
								<td>
										<p>匹配 "f"~"k" 之间的任意一个字母</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>[^A-F0-3]</p>
								</td>
								<td>
										<p>匹配 "A"~"F","0"~"3" 之外的任意一个字符</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    <a href="http://www.regexlab.com/zh/workshop.asp?pat=[bcd][bcd]&amp;txt=abc123">举例1：表达式 "[bcd][bcd]" 匹配 "abc123" 时</a>，匹配的结果是：成功；匹配到的内容是："bc"；匹配到的位置是：开始于1，结束于3。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5B%5Eabc%5D&amp;txt=abc123">举例2：表达式 "[^abc]" 匹配 "abc123" 时</a>，匹配的结果是：成功；匹配到的内容是："1"；匹配到的位置是：开始于3，结束于4。</p>
		<hr color="#fea089" size="1" />
		<p>
				<b>1.5 修饰匹配次数的特殊符号</b>
		</p>
		<p>    前面章节中讲到的表达式，无论是只能匹配一种字符的表达式，还是可以匹配多种字符其中任意一个的表达式，都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号，那么不用重复书写表达式就可以重复匹配。<br /><br />    使用方法是："次数修饰"放在"被修饰的表达式"后边。比如："[bcd][bcd]" 可以写成 "[bcd]{2}"。</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="67">
										<p>表达式</p>
								</td>
								<td>
										<p>作用</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>{n}</p>
								</td>
								<td>
										<p>表达式重复n次，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=\w{2}&amp;txt=ab+c6">"\w{2}" 相当于 "\w\w"</a>；<a href="http://www.regexlab.com/zh/workshop.asp?pat=a{5}&amp;txt=bbaaaaaddee">"a{5}" 相当于 "aaaaa"</a></p>
								</td>
						</tr>
						<tr>
								<td>
										<p>{m,n}</p>
								</td>
								<td>
										<p>表达式至少重复m次，最多重复n次，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=ba{1,3}&amp;txt=a,baaa,baa,b,ba">"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"</a></p>
								</td>
						</tr>
						<tr>
								<td>
										<p>{m,}</p>
								</td>
								<td>
										<p>表达式至少重复m次，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=\w\d{2,}&amp;txt=b1,a12,_456,_4AA,M12344,12346546547446534543543">"\w\d{2,}"可以匹配 "a12","_456","M12344"...</a></p>
								</td>
						</tr>
						<tr>
								<td>
										<p>?</p>
								</td>
								<td>
										<p>匹配表达式0次或者1次，相当于 {0,1}，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=a[cd]%3F&amp;txt=a,c,d,ac,ad">"a[cd]?"可以匹配 "a","ac","ad"</a></p>
								</td>
						</tr>
						<tr>
								<td>
										<p>+</p>
								</td>
								<td>
										<p>表达式至少出现1次，相当于 {1,}，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=a%2Bb&amp;txt=a%2Cb%2Cab%2Caab%2Caaab">"a+b"可以匹配 "ab","aab","aaab"...</a></p>
								</td>
						</tr>
						<tr>
								<td>
										<p>*</p>
								</td>
								<td>
										<p>表达式不出现或出现任意次，相当于 {0,}，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5C%5E*b&amp;txt=%5E%2Cb%2C%5E%5E%5Eb%2C%5E%5E%5E%5E%5E%5E%5Eb">"\^*b"可以匹配 "b","^^^b"...</a></p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cd%2B%5C.%3F%5Cd*&amp;txt=It%20costs%20%2412.5">举例1：表达式 "\d+\.?\d*" 在匹配 "It costs $12.5" 时</a>，匹配的结果是：成功；匹配到的内容是："12.5"；匹配到的位置是：开始于10，结束于14。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=go{2,8}gle&amp;txt=Ads%20by%20goooooogle%2C%20or%20gooogle">举例2：表达式 "go{2,8}gle" 在匹配 "Ads by goooooogle" 时</a>，匹配的结果是：成功；匹配到的内容是："goooooogle"；匹配到的位置是：开始于7，结束于17。</p>
		<hr color="#fea089" size="1" />
		<p>
				<b>1.6 其他一些代表抽象意义的特殊符号</b>
		</p>
		<p>    一些符号在表达式中代表抽象的特殊意义：</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="67">
										<p>表达式</p>
								</td>
								<td>
										<p>作用</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>^</p>
								</td>
								<td>
										<p>与字符串开始的地方匹配，不匹配任何字符</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>$</p>
								</td>
								<td>
										<p>与字符串结束的地方匹配，不匹配任何字符</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\b</p>
								</td>
								<td>
										<p>匹配一个单词边界，也就是单词和空格之间的位置，不匹配任何字符</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    进一步的文字说明仍然比较抽象，因此，举例帮助大家理解。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=^aaa&amp;txt=xxx+aaa+xxx">举例1：表达式 "^aaa" 在匹配 "xxx aaa xxx" 时</a>，匹配结果是：失败。因为 "^" 要求与字符串开始的地方匹配，因此，只有当 "aaa" 位于字符串的开头的时候，"^aaa" 才能匹配，<a href="http://www.regexlab.com/zh/workshop.asp?pat=^aaa&amp;txt=aaa+xxx+xxx">比如："aaa xxx xxx"</a>。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=aaa$&amp;txt=xxx+aaa+xxx">举例2：表达式 "aaa$" 在匹配 "xxx aaa xxx" 时</a>，匹配结果是：失败。因为 "$" 要求与字符串结束的地方匹配，因此，只有当 "aaa" 位于字符串的结尾的时候，"aaa$" 才能匹配，<a href="http://www.regexlab.com/zh/workshop.asp?pat=aaa$&amp;txt=xxx+xxx+aaa">比如："xxx xxx aaa"</a>。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=.%5Cb.&amp;txt=@@@abc">http://www.regexlab.com/zh/workshop.asp?pat=.%5Cb.&amp;txt=@@@abc</a>，匹配结果是：成功；匹配到的内容是："@a"；匹配到的位置是：开始于2，结束于4。<br />    进一步说明："\b" 与 "^" 和 "$" 类似，本身不匹配任何字符，但是它要求它在匹配结果中所处位置的左右两边，其中一边是 "\w" 范围，另一边是 非"\w" 的范围。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cbend%5Cb&amp;txt=weekend,endfor,end">举例4：表达式 "\bend\b" 在匹配 "weekend,endfor,end" 时</a>，匹配结果是：成功；匹配到的内容是："end"；匹配到的位置是：开始于15，结束于18。</p>
		<p>    一些符号可以影响表达式内部的子表达式之间的关系：</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="65">
										<p>表达式</p>
								</td>
								<td>
										<p>作用</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>|</p>
								</td>
								<td>
										<p>左右两边表达式之间 "或" 关系，匹配左边或者右边</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>( )</p>
								</td>
								<td>
										<p>(1). 在被修饰匹配次数的时候，括号中的表达式可以作为整体被修饰<br />(2). 取匹配结果的时候，括号中的表达式匹配到的内容可以被单独得到</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    <a href="http://www.regexlab.com/zh/workshop.asp?pat=Tom%7CJack&amp;txt=I%27m+Tom%2C+he+is+Jack">举例5：表达式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 时</a>，匹配结果是：成功；匹配到的内容是："Tom"；匹配到的位置是：开始于4，结束于7。匹配下一个时，匹配结果是：成功；匹配到的内容是："Jack"；匹配到的位置时：开始于15，结束于19。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28go%5Cs*%29%2B&amp;txt=Let%27s%20go%20go%20go%21">举例6：表达式 "(go\s*)+" 在匹配 "Let's go go go!" 时</a>，匹配结果是：成功；匹配到内容是："go go go"；匹配到的位置是：开始于6，结束于14。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%uFFE5%28%5Cd%2B%5C.%3F%5Cd*%29&amp;txt=%uFF0410.9%2C%uFFE520.5">举例7：表达式 "￥(\d+\.?\d*)" 在匹配 "＄10.9,￥20.5" 时</a>，匹配的结果是：成功；匹配到的内容是："￥20.5"；匹配到的位置是：开始于6，结束于10。单独获取括号范围匹配到的内容是："20.5"。</p>
		<hr color="#fea089" size="1" />
		<p>
				<b>2. 正则表达式中的一些高级规则</b>
		</p>
		<p>
				<b>2.1 匹配次数中的贪婪与非贪婪</b>
		</p>
		<p>    在使用修饰匹配次数的特殊符号时，有几种表示方法可以使同一个表达式能够匹配不同的次数，比如："{m,n}", "{m,}", "?", "*", "+"，具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中，总是尽可能多的匹配。比如，针对文本 "dxxxdxxxd"，举例如下：</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="93">
										<p>表达式</p>
								</td>
								<td>
										<p>匹配结果</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B)&amp;txt=dxxxdxxxd">(d)(\w+)</a>
										</p>
								</td>
								<td>
										<p>"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B)(d)&amp;txt=dxxxdxxxd">(d)(\w+)(d)</a>
										</p>
								</td>
								<td>
										<p>"\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d"，但是为了使整个表达式匹配成功，"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d"</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    由此可见，"\w+" 在匹配的时候，总是尽可能多的匹配符合它规则的字符。虽然第二个举例中，它没有匹配最后一个 "d"，但那也是为了让整个表达式能够匹配成功。同理，带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配，带 "?" 的表达式在可匹配可不匹配的时候，也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。</p>
		<p>    非贪婪模式：<br /><br />    在修饰匹配次数的特殊符号后再加上一个 "?" 号，则可以使匹配次数不定的表达式尽可能少的匹配，使可匹配可不匹配的表达式，尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式，也叫作 "勉强" 模式。如果少匹配就会导致整个表达式匹配失败的时候，与贪婪模式类似，非贪婪模式会最小限度的再匹配一些，以使整个表达式匹配成功。举例如下，针对文本 "dxxxdxxxd" 举例：</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="93">
										<p>表达式</p>
								</td>
								<td>
										<p>匹配结果</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B%3F)&amp;txt=dxxxdxxxd">(d)(\w+?)</a>
										</p>
								</td>
								<td>
										<p>"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符，结果是："\w+?" 只匹配了一个 "x"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=(d)(%5Cw%2B%3F)(d)&amp;txt=dxxxdxxxd">(d)(\w+?)(d)</a>
										</p>
								</td>
								<td>
										<p>为了让整个表达式匹配成功，"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配，从而使整个表达式匹配成功。因此，结果是："\w+?" 匹配 "xxx"</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>    更多的情况，举例如下：<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%3Ctd%3E%28%2E%2A%29%3C%2Ftd%3E&amp;txt=%3Ctd%3E%3Cp%3Eaa%3C%2Fp%3E%3C%2Ftd%3E%3Ctd%3E%3Cp%3Ebb%3C%2Fp%3E%3C%2Ftd%3E">举例1：表达式 "&lt;td&gt;(.*)&lt;/td&gt;" 与字符串 "&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt; &lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;" 匹配时</a>，匹配的结果是：成功；匹配到的内容是 "&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt; &lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;" 整个字符串， 表达式中的 "&lt;/td&gt;" 将与字符串中最后一个 "&lt;/td&gt;" 匹配。 <br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%3Ctd%3E%28%2E%2A%3F%29%3C%2Ftd%3E&amp;txt=%3Ctd%3E%3Cp%3Eaa%3C%2Fp%3E%3C%2Ftd%3E%3Ctd%3E%3Cp%3Ebb%3C%2Fp%3E%3C%2Ftd%3E">举例2：相比之下，表达式 "&lt;td&gt;(.*?)&lt;/td&gt;" 匹配举例1中同样的字符串时</a>，将只得到 "&lt;td&gt;&lt;p&gt;aa&lt;/p&gt;&lt;/td&gt;"， 再次匹配下一个时，可以得到第二个 "&lt;td&gt;&lt;p&gt;bb&lt;/p&gt;&lt;/td&gt;"。</p>
		<hr color="#fea089" size="1" />
		<p>
				<b>2.2 反向引用 \1, \2...</b>
		</p>
		<p>    表达式在匹配时，表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候，小括号包含的表达式所匹配到的字符串可以单独获取。这一点，在前面的举例中，已经多次展示了。在实际应用场合中，当用某种边界来查找，而所要获取的内容又不包含边界时，必须使用小括号来指定所要的范围。比如前面的 "&lt;td&gt;(.*?)&lt;/td&gt;"。<br /><br />    其实，"小括号包含的表达式所匹配到的字符串" 不仅是在匹配结束后才可以使用，在匹配过程中也可以使用。表达式后边的部分，可以引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是 "\" 加上一个数字。"\1" 引用第1对括号内匹配到的字符串，"\2" 引用第2对括号内匹配到的字符串……以此类推，如果一对括号内包含另一对括号，则外层的括号先排序号。换句话说，哪一对的左括号 "(" 在前，那这一对就先排序号。</p>
		<p>    举例如下：<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%27%7C%22%29%28%2E%2A%3F%29%28%5C1%29&amp;txt=%27Hello%27%2C+%22World%22">举例1：表达式 "('|")(.*?)(\1)" 在匹配 " 'Hello', "World" " 时</a>，匹配结果是：成功；匹配到的内容是：" 'Hello' "。再次匹配下一个时，可以匹配到 " "World" "。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%5Cw%29%5C1%7B4%2C%7D&amp;txt=aa%20bbbb%20abcdefg%20ccccc%20111121111%20999999999">举例2：表达式 "(\w)\1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时</a>，匹配结果是：成功；匹配到的内容是 "ccccc"。再次匹配下一个时，将得到 999999999。这个表达式要求 "\w" 范围的字符至少重复5次，<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cw%7B5%2C%7D&amp;txt=aa%20bbbb%20abcdefg%20ccccc%20111121111%20999999999">注意与 "\w{5,}" 之间的区别</a>。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%3C%28%5Cw%2B%29%5Cs%2A%28%5Cw%2B%28%3D%28%27%7C%22%29%2E%2A%3F%5C4%29%3F%5Cs%2A%29%2A%3E%2E%2A%3F%3C%2F%5C1%3E&amp;txt=%3Ctd+id%3D%27td1%27+style%3D%22bgcolor%3Awhite%22%3E%3C%2Ftd%3E%0D%0A%3Cbody+onload%3D%22doit%28%29%22%3E%3C%2Fbody%3E">举例3：表达式 "&lt;(\w+)\s*(\w+(=('|").*?\4)?\s*)*&gt;.*?&lt;/\1&gt;" 在匹配 "&lt;td id='td1' style="bgcolor:white"&gt;&lt;/td&gt;" 时</a>，匹配结果是成功。如果 "&lt;td&gt;" 与 "&lt;/td&gt;" 不配对，则会匹配失败；如果改成其他配对，也可以匹配成功。</p>
		<hr color="#fea089" size="1" />
		<p>
				<b>2.3 预搜索，不匹配；反向预搜索，不匹配</b>
		</p>
		<p>    前面的章节中，我讲到了几个代表抽象意义的特殊符号："^"，"$"，"\b"。它们都有一个共同点，那就是：它们本身不匹配任何字符，只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件。理解到这个概念以后，本节将继续介绍另外一种对 "两头" 或者 "缝隙" 附加条件的，更加灵活的表示方法。</p>
		<p>    正向预搜索："(?=xxxxx)"，"(?!xxxxx)"<br /><br />    格式："(?=xxxxx)"，在被匹配的字符串中，它对所处的 "缝隙" 或者 "两头" 附加的条件是：所在缝隙的右侧，必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件，所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 "\b"，本身不匹配任何字符。"\b" 只是将所在缝隙之前、之后的字符取来进行了一下判断，不会影响后边的表达式来真正的匹配。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=Windows+%28%3F%3DNT%7CXP%29&amp;txt=Windows+98%2C+Windows+NT%2C+Windows+2000">举例1：表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 时</a>，将只匹配 "Windows NT" 中的 "Windows "，其他的 "Windows " 字样则不被匹配。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%5Cw%29%28%28%3F%3D%5C1%5C1%5C1%29%28%5C1%29%29%2B&amp;txt=aaa+ffffff+999999999">举例2：表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时</a>，将可以匹配6个"f"的前4个，可以匹配9个"9"的前7个。这个表达式可以读解成：重复4次以上的字母数字，则匹配其剩下最后2位之前的部分。当然，这个表达式可以不这样写，在此的目的是作为演示之用。</p>
		<p>    格式："(?!xxxxx)"，所在缝隙的右侧，必须不能匹配 xxxxx 这部分表达式。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%28%3F%21%5Cbstop%5Cb%29%2E%29%2B&amp;txt=fdjka+ljfdl+stop+fjdsla+fdj">举例3：表达式 "((?!\bstop\b).)+" 在匹配 "fdjka ljfdl stop fjdsla fdj" 时</a>，将从头一直匹配到 "stop" 之前的位置，如果字符串中没有 "stop"，则匹配整个字符串。<br /><br />    <a href="http://www.regexlab.com/zh/workshop.asp?pat=do%28%3F%21%5Cw%29&amp;txt=done%2C+do%2C+dog">举例4：表达式 "do(?!\w)" 在匹配字符串 "done, do, dog" 时</a>，只能匹配 "do"。在本条举例中，"do" 后边使用 "(?!\w)" 和使用 "\b" 效果是一样的。</p>
		<p>    反向预搜索："(?&lt;=xxxxx)"，"(?&lt;!xxxxx)"<br /><br />    这两种格式的概念和正向预搜索是类似的，反向预搜索要求的条件是：所在缝隙的 "左侧"，两种格式分别要求必须能够匹配和必须不能够匹配指定表达式，而不是去判断右侧。与 "正向预搜索" 一样的是：它们都是对所在缝隙的一种附加条件，本身都不匹配任何字符。<br /><br />    举例5：表达式 "(?&lt;=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 时，将匹配除了前4个数字和后4个数字之外的中间8个数字。由于 JScript.RegExp 不支持反向预搜索，因此，本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索，比如：Java 1.4 以上的 java.util.regex 包，.NET 中System.Text.RegularExpressions 命名空间，boost::regex 以及 <a href="http://www29.websamba.com/sswater/zh/greta/index.htm">GRETA 正则表达式库</a>等。</p>
		<hr color="#fea089" size="1" />
		<p>
				<b>3. 其他通用规则</b>
		</p>
		<p>    还有一些在各个正则表达式引擎之间比较通用的规则，在前面的讲解过程中没有提到。</p>
		<p>3.1 表达式中，可以使用 "\xXX" 和 "\uXXXX" 表示一个字符（"X" 表示一个十六进制数）</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="63">
										<p>形式</p>
								</td>
								<td>
										<p>字符范围</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\xXX</p>
								</td>
								<td>
										<p>编号在 0 ~ 255 范围的字符，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cx20&amp;txt=It+is%2E">空格可以使用 "\x20" 表示</a></p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\uXXXX</p>
								</td>
								<td>
										<p>任何字符可以使用 "\u" 再加上其编号的4位十六进制数表示，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cu4E2D&amp;txt=%D6%D0%B9%FA">"\u4E2D"</a></p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>3.2 在表达式 "\s"，"\d"，"\w"，"\b" 表示特殊意义的同时，对应的大写字母表示相反的意义</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="55">
										<p>表达式</p>
								</td>
								<td>
										<p>可匹配</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\S</p>
								</td>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5CS%2B&amp;txt=abc+123+%40%23%24%25">匹配所有非空白字符（"\s" 可匹配各个空白字符）</a>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\D</p>
								</td>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5CD%2B&amp;txt=abc+123+%40%23%24%25">匹配所有的非数字字符</a>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\W</p>
								</td>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5CW%2B&amp;txt=abc+123+%40%23%24%25">匹配所有的字母、数字、下划线以外的字符</a>
										</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>\B</p>
								</td>
								<td>
										<p>
												<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5CB%2E%5CB&amp;txt=abc+123+%40%23%24%25">匹配非单词边界，即左右两边都是 "\w" 范围或者左右两边都不是 "\w" 范围时的字符缝隙</a>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>3.3 在表达式中有特殊意义，需要添加 "\" 才能匹配该字符本身的字符汇总</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="55">
										<p>字符</p>
								</td>
								<td>
										<p>说明</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>^</p>
								</td>
								<td>
										<p>匹配输入字符串的开始位置。要匹配 "^" 字符本身，请使用 "\^"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>$</p>
								</td>
								<td>
										<p>匹配输入字符串的结尾位置。要匹配 "$" 字符本身，请使用 "\$"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>( )</p>
								</td>
								<td>
										<p>标记一个子表达式的开始和结束位置。要匹配小括号，请使用 "\(" 和 "\)"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>[ ]</p>
								</td>
								<td>
										<p>用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号，请使用 "\[" 和 "\]"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>{ }</p>
								</td>
								<td>
										<p>修饰匹配次数的符号。要匹配大括号，请使用 "\{" 和 "\}"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>.</p>
								</td>
								<td>
										<p>匹配除了换行符（\n）以外的任意一个字符。要匹配小数点本身，请使用 "\."</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>?</p>
								</td>
								<td>
										<p>修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身，请使用 "\?"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>+</p>
								</td>
								<td>
										<p>修饰匹配次数为至少 1 次。要匹配 "+" 字符本身，请使用 "\+"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>*</p>
								</td>
								<td>
										<p>修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身，请使用 "\*"</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>|</p>
								</td>
								<td>
										<p>左右两边表达式之间 "或" 关系。匹配 "|" 本身，请使用 "\|"</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>3.4 括号 "( )" 内的子表达式，如果希望匹配结果不进行记录供以后使用，可以使用 "(?:xxxxx)" 格式</p>
		<p>    <a href="http://www.regexlab.com/zh/workshop.asp?pat=%28%3F%3A%28%5Cw%29%5C1%29%2B&amp;txt=a bbccdd efg">举例1：表达式 "(?:(\w)\1)+" 匹配 "a bbccdd efg" 时</a>，结果是 "bbccdd"。括号 "(?:)" 范围的匹配结果不进行记录，因此 "(\w)" 使用 "\1" 来引用。</p>
		<p>3.5 常用的表达式属性设置简介：Ignorecase，Singleline，Multiline，Global</p>
		<table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="3" bgcolor="#f8f8f8" border="1">
				<tbody>
						<tr bgcolor="#f0f0f0">
								<td width="80">
										<p>表达式属性</p>
								</td>
								<td>
										<p>说明</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>Ignorecase</p>
								</td>
								<td>
										<p>默认情况下，表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎，把 "大小写" 概念延伸至 UNICODE 范围的大小写。</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>Singleline</p>
								</td>
								<td>
										<p>默认情况下，小数点 "." 匹配除了换行符（\n）以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>Multiline</p>
								</td>
								<td>
										<p>默认情况下，表达式 "^" 和 "$" 只匹配字符串的开始 ① 和结尾 ④ 位置。如：<br /><br />①xxxxxxxxx②\n<br />③xxxxxxxxx④<br /><br />配置为 Multiline 可以使 "^" 还可以匹配换行符之后，下一行开始前 ③ 的位置，使 "$" 还可以匹配换行符之前，一行结束 ② 的位置。</p>
								</td>
						</tr>
						<tr>
								<td>
										<p>Global</p>
								</td>
								<td>
										<p>主要在将表达式用来替换时起作用，配置为 Global 表示替换所有的匹配。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
		</p>
		<hr color="#fea089" size="1" />
		<p>
		</p>
		<p>
				<b>4. 综合提示</b>
		</p>
		<p>4.1 如果要要求表达式所匹配的内容是整个字符串，而不是从字符串中找一部分，那么可以在表达式的首尾使用 "^" 和 "$"，比如："^\d+$" 要求整个字符串只有数字。</p>
		<p>4.2 如果要求匹配的内容是一个完整的单词，而不会是单词的一部分，那么在表达式首尾使用 "\b"，比如：<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cb%28if%7Cwhile%7Celse%7Cvoid%7Cint%29%5Cb&amp;txt=if%28ifdo%29%0D%0A++++dosome%28%29%3B%0D%0Aelse%0D%0A++++doelse%28%29%3B">使用 "\b(if|while|else|void|int……)\b" 来匹配程序中的关键字</a>。</p>
		<p>4.3 表达式不要匹配空字符串。否则会一直得到匹配成功，而结果什么都没有匹配到。比如：准备写一个匹配 "123"、"123."、"123.5"、".5" 这几种形式的表达式时，整数、小数点、小数数字都可以省略，但是不要将表达式写成："\d*\.?\d*"，因为如果什么都没有，这个表达式也可以匹配成功。<a href="http://www.regexlab.com/zh/workshop.asp?pat=%5Cd%2B%5C%2E%3F%5Cd%2A%7C%5C%2E%5Cd%2B&amp;txt=123%2C+123%2E%2C+123%2E5%2C+%2E5%2C+%2E">更好的写法是："\d+\.?\d*|\.\d+"</a>。</p>
		<p>4.4 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次，而这个括号整体又可以匹配无限次，那么情况可能比上一条所说的更严重，匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了，比如 .NET 的正则表达式，但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环，也可以从这一点入手，查找一下是否是本条所说的原因。</p>
		<p>4.5 合理选择贪婪模式与非贪婪模式。</p>
		<p>4.6 或 "|" 的左右两边，对某个字符最好只有一边可以匹配，这样，不会因为 "|" 两边的表达式因为交换位置而有所不同。</p>
		<p> </p>
		<p>
				<strong>
						<font color="#ff0000">1，基本描述<br /></font>
				</strong>
		</p>
		<p>
				<strong>1.1 方法签名：oNewWindow = window.open( sURL <u>,</u> sName <u>, </u>sFeatures<u>, </u>bReplace)</strong>
				<br />通过方法签名可以看出，window.open在打开一个窗口(其url为sURL)后，将返回一个代表该窗口对象的一个变量<br />oNewWindow，如果打开不成功，则oNewWindow的值为null。同时为了对打开的窗口预先做一些控制，提供了<br />其他一些参数（sName、sFeatures、bReplace）可供选择配置，下面将具体说明每个参数的含义<br /></p>
		<p>
				<strong>1.2 各参数的含义</strong>
				<br />
		</p>
		<ul>
				<li>oNewWindow：被打开的窗口的对象 
</li>
				<li>sUrl：被打开窗口的url 
</li>
				<li>sName：在哪个窗口打开新的url链接，例如可以为_blank（新窗口）、_top（最外层窗口）等等 
</li>
				<li>sFeatures：对窗口的一些控制属性 
<ul><li>fullscreen：是否为全屏模式（相当于F11的效果），可取值：yes/1、no/0 
</li><li>directories：是否带有目录按钮（例如收藏夹中的'链接'目录），可取值同上 
</li><li>location：是否带有地址栏，可取值同上 
</li><li>channelmode：是否为影院模式，可取值同上 
</li><li>menubar：是否带有菜单条，可取值同上 
</li><li>resizable：是否可以改变窗口的尺寸，可取值同上 
</li><li>scrollbars：是否带有滚动条，可取值同上 
</li><li>status：是否带有状态栏，可取值同上 
</li><li>titlebar：是否带有标题栏，可取值同上 
</li><li>toolbar：是否带有快捷工具栏，可取值同上 
</li><li>height：窗口高度 
</li><li>width：窗口宽度 
</li><li>top：距屏幕上边缘的距离 
</li><li>left：距屏幕左边缘的距离 </li></ul></li>
				<li>bReplace：如果在同一窗口打开新窗口，该值用于指定是否在history中替换原窗口的url链接，可取值：true/false </li>
		</ul>
		<p> </p>
		<p>
				<strong>
						<font color="#ff0000">2，基本使用</font>
				</strong>
				<br />
		</p>
		<ul>
				<li>在一个新窗口中打开某个链接link(/myoa/admin/manage.jsp) </li>
		</ul>
		<!-- ======================================================== -->
		<!-- = Java Sourcecode to HTML automatically converted code = -->
		<!-- =   Java2Html Converter V3.6 2003 by Markus Gebhard  markus@jave.de   = -->
		<!-- =     Further information: http://www.java2html.de     = -->
		<div class="java" align="left">
				<table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0">
						<tbody>
								<tr>
										<!-- start source code -->
										<td valign="top" nowrap="" align="left">
												<code>
														<font color="#ffffff">
														</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">window.open</font>
														<font color="#000000">(</font>
														<font color="#2a00ff">"/myoa/admin/manage.jsp"</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">或者</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">window.open</font>
														<font color="#000000">(</font>
														<font color="#2a00ff">"/myoa/admin/manage.jsp"</font>
														<font color="#000000">,</font>
														<font color="#2a00ff">"_blank"</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">注意：这样的话，每次执行都会打开一个新窗口，即使上次打开的新窗口未关闭，仍然会弹出新的</font>
												</code>
										</td>
										<!-- end source code -->
								</tr>
						</tbody>
				</table>
		</div>
		<!-- =       END of automatically generated HTML code       = -->
		<!-- ======================================================== -->
		<ul>
				<li>在指定的某个窗口中打开某个链接link（/myoa/admin/manage.jsp） </li>
		</ul>
		<!-- ======================================================== -->
		<!-- = Java Sourcecode to HTML automatically converted code = -->
		<!-- =   Java2Html Converter V3.6 2003 by Markus Gebhard  markus@jave.de   = -->
		<!-- =     Further information: http://www.java2html.de     = -->
		<div class="java" align="left">
				<table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0">
						<tbody>
								<tr>
										<!-- start source code -->
										<td valign="top" nowrap="" align="left">
												<code>
														<font color="#ffffff">
														</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">window.open</font>
														<font color="#000000">(</font>
														<font color="#2a00ff">"/myoa/admin/manage.jsp"</font>
														<font color="#000000">,</font>
														<font color="#2a00ff">"myWiddown"</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<font color="#3f7f5f">//myWindow即为窗口的名称</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">注意：如果myWindow窗口不存在，那么将会新弹出一个窗口，并将新窗口命名为myWindow，只要该窗口</font>
														<br />
														<font color="#ffffff">     </font>
														<font color="#000000">不关闭，那么以后执行该open，弹出窗口均为这个已经存在的myWindow</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">另外，有一些窗口名称已经被浏览器使用，具有特殊的含义，例如：_blank、_top、_parent、_self等</font>
												</code>
										</td>
										<!-- end source code -->
								</tr>
						</tbody>
				</table>
		</div>
		<!-- =       END of automatically generated HTML code       = -->
		<!-- ======================================================== -->
		<ul>
				<li>打开一个新窗口，要求窗口高度300px、宽度500px、不带滚动条、不带地址栏（/myoa/admin/manage.jsp） </li>
		</ul>
		<!-- ======================================================== -->
		<!-- = Java Sourcecode to HTML automatically converted code = -->
		<!-- =   Java2Html Converter V3.6 2003 by Markus Gebhard  markus@jave.de   = -->
		<!-- =     Further information: http://www.java2html.de     = -->
		<div class="java" align="left">
				<table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0">
						<tbody>
								<tr>
										<!-- start source code -->
										<td valign="top" nowrap="" align="left">
												<code>
														<font color="#ffffff">
														</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">window.open</font>
														<font color="#000000">(</font>
														<font color="#2a00ff">"/myoa/admin/manage.jsp"</font>
														<font color="#000000">,</font>
														<font color="#2a00ff">"_blank"</font>
														<font color="#000000">,</font>
														<font color="#2a00ff">"height=300,width=500,scrollbars=no,location=no"</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">注意：sFeatures这些参数之间是用逗号分隔的，而在window.showModalDialog中，是用分号进行分隔的，一定要注意！</font>
												</code>
										</td>
										<!-- end source code -->
								</tr>
						</tbody>
				</table>
		</div>
		<!-- =       END of automatically generated HTML code       = -->
		<!-- ======================================================== -->
		<p> </p>
		<p>
				<strong>
						<font color="#ff0000">3，高级部分</font>
				</strong>
				<br />
		</p>
		<ul>
				<li>原窗口与弹出窗口之间的对象定位 
<ul><li>概述：弹出窗口是我们在页面编程中经常使用的一种方式，从互动角度分析，弹出窗口主要有两种类型，一种是信息显示窗口，例如人员信息、文章信息等等；另外一种是继续处理窗口，例如有些项目中，新建文章就是弹出窗口来完成的。对于信息显示窗口，用户看完之后关闭就可以了，但是对于继续处理窗口，在用户继续处理之后，往往需要与原窗口进行户动，例如当在新窗口中创建一篇文章提交后，希望在弹出窗口关闭的同时，原窗口能够刷新等等。 
</li><li>解决方式：上面方式的一个关键就是，如何获取原窗口与弹出窗口对象，在DOM模型中我们可以明确的看到： 
<ul><li>原窗口中获取弹出窗口对象： </li></ul></li></ul></li>
		</ul>
		<!-- ======================================================== -->
		<!-- = Java Sourcecode to HTML automatically converted code = -->
		<!-- =   Java2Html Converter V3.6 2003 by Markus Gebhard  markus@jave.de   = -->
		<!-- =     Further information: http://www.java2html.de     = -->
		<div class="java" align="left">
				<table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0">
						<tbody>
								<tr>
										<!-- start source code -->
										<td valign="top" nowrap="" align="left">
												<code>
														<font color="#ffffff">
														</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">var infoWindow=window.open</font>
														<font color="#000000">(</font>
														<font color="#2a00ff">"create.jsp"</font>
														<font color="#000000">,</font>
														<font color="#2a00ff">"_blank"</font>
														<font color="#000000">,</font>
														<font color="#2a00ff">"width=500,height=400"</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#3f7f5f">//infoWindow即代表了弹出窗口的window对象，例如在弹出窗口中有一个表单(myForm)和表单中的一个输入控件(username)，我们可以这样操作：</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">infoWindow.document.myForm.username.value=</font>
														<font color="#2a00ff">"lisi"</font>
														<font color="#000000">;</font>
												</code>
										</td>
										<!-- end source code -->
								</tr>
						</tbody>
				</table>
		</div>
		<!-- =       END of automatically generated HTML code       = -->
		<!-- ======================================================== -->
		<ul>
				<ul>
						<li>弹出窗口中获取原窗口对象： </li>
				</ul>
		</ul>
		<!-- ======================================================== -->
		<!-- = Java Sourcecode to HTML automatically converted code = -->
		<!-- =   Java2Html Converter V3.6 2003 by Markus Gebhard  markus@jave.de   = -->
		<!-- =     Further information: http://www.java2html.de     = -->
		<div class="java" align="left">
				<table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0">
						<tbody>
								<tr>
										<!-- start source code -->
										<td valign="top" nowrap="" align="left">
												<code>
														<font color="#ffffff">
														</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">如上例，在create.jsp中，我们可以如下操作来刷新原窗口</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">opener.location.reload</font>
														<font color="#000000">()</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">  </font>
														<font color="#3f7f5f">//opener是DOM中提供的一个默认对象，表示的就是某个窗口的原窗口。</font>
												</code>
										</td>
										<!-- end source code -->
								</tr>
						</tbody>
				</table>
		</div>
		<!-- =       END of automatically generated HTML code       = -->
		<!-- ======================================================== -->
		<ul>
				<li>wondow.open的缓存处理 
<ul><li>概述：如果window.open链接的target指定的是一个已经存在了的窗口，尤其是原页面中的一个frame和iframe的话，此时window.open打开的链接页面将不会从服务器重新请求，而是使用浏览器中相应的缓存页面，至少ie给人的感觉就是这样的，例如： </li></ul></li>
		</ul>
		<!-- ======================================================== -->
		<!-- = Java Sourcecode to HTML automatically converted code = -->
		<!-- =   Java2Html Converter V3.6 2003 by Markus Gebhard  markus@jave.de   = -->
		<!-- =     Further information: http://www.java2html.de     = -->
		<div class="java" align="left">
				<table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0">
						<tbody>
								<tr>
										<!-- start source code -->
										<td valign="top" nowrap="" align="left">
												<code>
														<font color="#ffffff">
														</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">&lt;input type=</font>
														<font color="#2a00ff">"button" </font>
														<font color="#000000">value=</font>
														<font color="#2a00ff">"显示列表" </font>
														<font color="#000000">onclick=</font>
														<font color="#2a00ff">"window.open('/myoa/users/list.jsp','main','')"</font>
														<font color="#000000">/&gt;</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">&lt;hr&gt;</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">&lt;iframe name=</font>
														<font color="#2a00ff">"main" </font>
														<font color="#000000">src=</font>
														<font color="#2a00ff">"/myoa/users/list.jsp" </font>
														<font color="#000000">width=</font>
														<font color="#2a00ff">"100%" </font>
														<font color="#000000">height=</font>
														<font color="#2a00ff">"600" </font>
														<font color="#000000">frameborder=</font>
														<font color="#2a00ff">"0"</font>
														<font color="#000000">&gt;&lt;/iframe&gt;</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">第一次方式该页面是可以看到一个列表，那么此时即使新创建一条记录，那么再点击“显示列表”按钮时，会发现列表没有发生变化，此时关闭浏览器重新进行发现列表出现了刚创建的那条记录，可见缓存起了作用。</font>
												</code>
										</td>
										<!-- end source code -->
								</tr>
						</tbody>
				</table>
		</div>
		<!-- =       END of automatically generated HTML code       = -->
		<!-- ======================================================== -->
		<ul>
				<ul>
						<li>解决办法：实验中我们发现，<a></a>中导向链接不会发生上面的现象，每次都是重新请求，同样是上面的例子，使用下面的方式就是可以的： </li>
				</ul>
		</ul>
		<!-- ======================================================== -->
		<!-- = Java Sourcecode to HTML automatically converted code = -->
		<!-- =   Java2Html Converter V3.6 2003 by Markus Gebhard  markus@jave.de   = -->
		<!-- =     Further information: http://www.java2html.de     = -->
		<div class="java" align="left">
				<table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0">
						<tbody>
								<tr>
										<!-- start source code -->
										<td valign="top" nowrap="" align="left">
												<code>
														<font color="#ffffff">
														</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">&lt;a href=</font>
														<font color="#2a00ff">"/myoa/users/list.jsp" </font>
														<font color="#000000">target=</font>
														<font color="#2a00ff">"main"</font>
														<font color="#000000">&gt;显示列表&lt;/a&gt;</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">&lt;hr&gt;</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">&lt;iframe name=</font>
														<font color="#2a00ff">"main" </font>
														<font color="#000000">src=</font>
														<font color="#2a00ff">"/myoa/users/list.jsp" </font>
														<font color="#000000">width=</font>
														<font color="#2a00ff">"100%" </font>
														<font color="#000000">height=</font>
														<font color="#2a00ff">"600" </font>
														<font color="#000000">frameborder=</font>
														<font color="#2a00ff">"0"</font>
														<font color="#000000">&gt;&lt;/iframe&gt;</font>
												</code>
										</td>
										<!-- end source code -->
								</tr>
						</tbody>
				</table>
		</div>
		<p>
				<!-- =       END of automatically generated HTML code       = -->
				<!-- ======================================================== -->不过有许多时候，我们不的不使用window.open到本页面某个iframe的方式（以后你可能会碰到的），那么可以类这样解决： <!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V3.6 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p>
		<div class="java" align="left">
				<table cellspacing="0" cellpadding="3" bgcolor="#ffffff" border="0">
						<tbody>
								<tr>
										<!-- start source code -->
										<td valign="top" nowrap="" align="left">
												<code>
														<font color="#ffffff">
														</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">&lt;input type=</font>
														<font color="#2a00ff">"button" </font>
														<font color="#000000">value=</font>
														<font color="#2a00ff">"显示列表" </font>
														<font color="#000000">onclick=</font>
														<font color="#2a00ff">"document.getElementById('showlist').click()"</font>
														<font color="#000000">/&gt;</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">&lt;a href=</font>
														<font color="#2a00ff">"/myoa/users/list.jsp" </font>
														<font color="#000000">target=</font>
														<font color="#2a00ff">"main" </font>
														<font color="#000000">id=</font>
														<font color="#2a00ff">"showlist" </font>
														<font color="#000000">style=</font>
														<font color="#2a00ff">"display:none"</font>
														<font color="#000000">&gt;显示列表&lt;/a&gt;</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">&lt;hr&gt;</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">&lt;iframe name=</font>
														<font color="#2a00ff">"main" </font>
														<font color="#000000">src=</font>
														<font color="#2a00ff">"/myoa/users/list.jsp" </font>
														<font color="#000000">width=</font>
														<font color="#2a00ff">"100%" </font>
														<font color="#000000">height=</font>
														<font color="#2a00ff">"600" </font>
														<font color="#000000">frameborder=</font>
														<font color="#2a00ff">"0"</font>
														<font color="#000000">&gt;&lt;/iframe&gt;</font>
														<br />
														<font color="#ffffff">   </font>
														<font color="#000000">上面的找个例子比较简单，在实际的项目中，在隐藏的link被触发之前，还需要做许多的javascipt工作。</font>
												</code>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
<img src ="http://www.blogjava.net/19851985lili/aggbug/97621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-02-02 19:41 <a href="http://www.blogjava.net/19851985lili/articles/97621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js</title><link>http://www.blogjava.net/19851985lili/articles/97620.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Fri, 02 Feb 2007 11:38:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/97620.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/97620.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/97620.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/97620.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/97620.html</trackback:ping><description><![CDATA[
		<p>
				<strong>三道测试题：<br />1， var str=“ abbbbacc”;<br />var rs=str.replace(“a”,”0”);    <br /><font color="#ff0000">(A)</font>0bbbbacc (B)0bbbb0cc<br />2，var str=“ abbbbacc”;<br />var rs=str.replace(“/a/”,”0”);    <br /><font color="#ff0000">(A)</font>0bbbbacc (B)0bbbb0cc <br />3，var str=“ abbbbacc”;<br />var rs=str.replace(“/a/g”,”0”);    <br />(A)0bbbbacc <font color="#ff0000">(B)</font>0bbbb0cc <br />附注：String对象的replace方法签名为：<br />replace(regx,str)<br /><br /><font size="5">一，概述</font></strong>
		</p>
		<p>1，正则表达式，可以说是任何一种编程语言都提供的机制，它主要是提供了对字符串的处理能力。<br />2，正则表达式在页面处理中的使用场景：<br />1）表单验证。验证某些域符合某种规则，例如邮件输入框必须输入的是邮件、联系电话输入框输入的必须是数字等等<br />2）处理DOM模型。例如通过表达式定位DOM中的一个对象或一系列对象，一个例子就是定位id属性中含有某个特殊字符的div对象。<br />3）纯编程逻辑。直接用于编程的逻辑之中。<br />3，说明：本部分所举的正则表达式的代码片断，都是经过测试的，但有一点需要注意，对于换行的字符串的定义，我们在表述时使用的是类似如下的形式：<br />var str=“It’s is<br /> a  beautiful city”；<br />这种形式直接写在JS代码中是错误的，那如何获取具有换行的字符串呢？简单的办法：在textarea中输入文本并换行，然后将该值赋给JS变量即可。例如：<br />var str=document.forms[0].mytextarea.value;          </p>
		<p>
				<strong>
						<font size="5">二，语法与使用</font>
				</strong>
		</p>
		<p>
				<strong>1，定义正则表达式</strong>
		</p>
		<p>1）定义正则表达式有两种形式，一种是普通方式，一种是构造函数方式。<br />2）普通方式：var reg=/表达式/附加参数<br />表达式：一个字符串，代表了某种规则，其中可以使用某些特殊字符，来代表特殊的规则，后面会详细说明。<br />附加参数：用来扩展表达式的含义，目前主要有三个参数：<br />g：代表可以进行全局匹配。<br />i：代表不区分大小写匹配。<br />m：代表可以进行多行匹配。<br />上面三个参数，可以任意组合，代表复合含义，当然也可以不加参数。<br />例子：<br />var reg=/a*b/;<br />var reg=/abc+f/g;<br />3）构造函数方式：var reg=new RegExp(“表达式”,”附加参数”);<br />其中“表达式”与“附加参数”的含义与上面那种定义方式中的含义相同。<br />例子：<br />var reg=new RegExp(“a*b”);<br />var reg=new RegExp(“abc+f”,”g”);<br />4）普通方式与构造函数方式的区别<br />普通方式中的表达式必须是一个常量字符串，而构造函数中的表达式可以是常量字符串，也可以是一个js变量，例如根据用户的输入来作为表达式参数等等：<br />var reg=new RegExp(document.forms[0].exprfiled.value,”g”);</p>
		<p>
				<strong>2，表达式模式</strong>
		</p>
		<p>1）表达式模式，是指表达式的表达方式与样式， 即 var reg=/表达式/附加参数 中的“表达式”怎样去描述？<br />2）从规范上讲，表达式模式分为简单模式和复合模式。<br />3）简单模式：是指通过普通字符的组合来表达的模式，例如<br />var reg=/abc0d/;<br />可见简单模式只能表示具体的匹配。<br />4）复合模式：是指含有通配符来表达的模式，例如：<br />var reg=/a+b?\w/;<br />其中的+、?和\w都属于通配符，代表着特殊的含义。因此复合模式可以表达更为抽象化的逻辑。<br />下面我们着重说一下复合模式中各个通配符的含义及其使用。<br />5)复合模式中特殊字符的讲解：</p>
		<p>1&gt;\：在许多编程语言里面被用作转义符，一般来说<br />\符号后面如果跟的是普通字符c，那么\c就代表特殊的含义，例如n本来代表字符n，但\n就代表换行。<br />\符号后面如果跟的是特殊字符c，那么\c就代表普通字符c，例如\一般用作转义符，但\\则调表普通字符\。<br />Javascript的正则表达式中\的用法与上面相同，只是不同的编程语言，特殊字符表可能不太一样罢了。</p>
		<p>2&gt;^：匹配输入字符串的起始端，如果是多行匹配，即表达式的附加参数中含有m，则也在一个换行符后匹配。<br />例子：/^B/匹配 “Bab Bc ”中的第一个B<br />例子2：/^B/gm匹配<br />          “Badd B<br />          cdaf<br />          B dsfB”<br />          中的第一行第一个B，第三行中的第一个B<br />          <br />3&gt;$：匹配输入字符创的尾端，如果是多行匹配，即表达式的附加参数中含有m，则也在一个换行符前匹配。<br />与^的用法相反。<br />例子：/t$/匹配“bat”中的t，但是不匹配“hate”中的t<br />例子2：/t$/匹配<br />“tag at<br />bat”<br />中第一行的最后一个t和第二行的t。</p>
		<p>4&gt;*：匹配前一个字符0次或多次。<br />例子：/ab*/匹配“dddabbbbc”中的“abbbb”，也匹配“ddda”中的“a”</p>
		<p>5&gt;+：匹配前一个字符1次或多次。<br />例子：/ab+/匹配“dddabbbbc”中的“abbbb”，但不匹配“ddda”<br />与后面的{1,}（原型：{n,}）的用法类似</p>
		<p>6&gt;?：?的用法比较特殊，一般来说它用来对前一个字符做0次或1次匹配，但是它有另外两种特殊的用法：<br />如果紧跟在*、+、?和{ }之后，则表示原始匹配的最小次数匹配，例如：<br />/ba*/本来匹配“bbbaaaa”中的“baaaa”，但是/ba*?/则匹配“bbbaaaa”中的“b”（因为*表示0次或多次匹配，而加?应该表示最少次数匹配，即0次匹配）。<br />同理：/ba+?/则匹配“baaaa”中的“ba”。<br />作为语法结构符号，使用于前置断言中，即后面要说到的x(?=y)和x(?!=y)</p>
		<p>7&gt;.：小数点中的“.”号，匹配任何一个单独的字符，但是换行符除外。<br />标准中总共有哪些字符？请参考：字符集<br />例如：/a.b/匹配“acbaa”中的“acb”，但是不匹配“abbb”。</p>
		<p>8&gt;(x)：表示匹配x(并非特指字符x或者特指一个字符，x表示一个字符串)，而且匹配会被记住，在语法中这种()被称为“capturing parentheses ”，即捕捉用的小括号。<br />匹配会被记住，是因为在表达式提供的函数中，有些函数返回一个数组，该数组会保存所匹配的所有字符串，例如exec()函数。<br />另外还要注意()中的x被记住的前提是匹配x。<br />例子1：<br />var regx=/a(b)c/;<br />var rs=regx.exec(“abcddd”);<br />从上面可以看出,/a(b)c/匹配“abcddd”中的“abc”，因为()的原因，b也会记录下来，因此rs返回的数字内容为：<br />{abc,b}<br />例子2：<br /> var regx=/a(b)c/;<br /> var rs=regx.exec(“acbcddd”);<br /> rs返回null，因为/a(b)c/不匹配“acbcddd”，所以()中的b不会被记录下来（尽管字符串中含有b）<br /> <br />9&gt;(?:x)：匹配x，但不会记住x，这种格式中的()被称为“non-capturing parentheses ”，即非捕捉用的小括号。<br />例子：<br />var regx=/a(?:b)c/;<br />var rs=regx.exec(“abcddd”);<br />从上面可以看出,/a(?:b)c/匹配“abcddd”中的“abc”，因为(?:)的原因，b不会记录下来，因此rs返回的数字内容为：<br />{abc}</p>
		<p>10&gt;X(?=y)：匹配x，仅当后面紧跟着y时。如果符合匹配，则只有x会被记住，y不会被记住。<br />例子：<br />var regx=/user(?=name)/;<br />var rs=regx.exec(“The username is Mary”);<br />结果：匹配成功，而且rs的值为{user}</p>
		<p>11&gt;X(?!y)：匹配x，仅当后面不紧跟着y时。如果符合匹配，则只有x会被记住，y不会被记住。<br />例子：<br />var regx=/user(?!name)/;<br />var rs=regx.exec(“The user name is Mary”);<br />结果：匹配成功，而且rs的值为{user}<br />例子2：<br />var regx=/\d+(?!\.)/;<br />var rs=regx.exec(“54.235”);<br />结果：匹配成果，rs的值为{5}，不匹配54是因为54后面跟着“.”号，当然235也匹配，但是由于exec方法的行为，235不会被返回</p>
		<p>12&gt;x|y：匹配x或y。注意如果x和y都匹配上了，那么只记住x。<br />例子：<br />var regx=/beijing|shanghai/;<br />var rs=regx.exec(“I love beijing and shanghai”);<br />结果：匹配成功，rs的值为{beijing}，虽然shanghai也匹配，但不会被记住。</p>
		<p>13&gt;{n}：匹配前一个字符的n次出现。<br />n必须是一个非负数，当然如果是一个负数或小数也不会报语法错误。<br />例子：<br />var regx=/ab{2}c/;<br />var rs=regx.exec(“abbcd”);<br />结果：匹配成功，rs的值为：{abbc}。</p>
		<p>14&gt;{n,}：匹配前一个字符的至少n次出现。<br />例子：<br />var regx=/ab{2,}c/;<br />var rs=regx.exec(“abbcdabbbc”);<br />结果：匹配成功，rs的值为：{abbc}。注意为什么abbbc也符合条件为什么没有被记住，这与exec方法的行为有关，后面会统一讲解。</p>
		<p>15&gt;{n,m}：匹配前一个字符的至少n次最多m次的出现。<br />只要n与m为数字，而且m&gt;=n就不会报语法错误。<br />例子：<br />var regx=/ab{2,5}c/;<br />var rs=regx.exec(“abbbcd”);<br />结果：匹配成功，rs的值为：{abbbc}。<br />例子2：<br />var regx=/ab{2,2}c/;<br />var rs=regx.exec(“abbcd”);<br />结果：匹配成功，rs的值为：{abbc}。<br />例子3：<br />var regx=/ab(2,5)/;<br />var rs=regx.exec(“abbbbbbbbbb”);<br />结果：匹配成功，rs的值为：{abbbbb}，这说明，如果前一个字符出现多于m次，则只匹配m次。另外：<br />var regx=/ab(2,5)c/;<br />var rs=regx.exec(“abbbbbbbbbbc”);<br />结果：匹配失败，rs的值为：null，为什么匹配失败，因为b多于5个则b(2,5)会匹配前5个b，，而表达式/ab(2,5)c/中b后面是c，但字符串中5个b之后还是b所以会报错。</p>
		<p>16&gt;[xyz]：xyz表示一个字符串，该模式表示匹配[]中的一个字符，形式上[xyz]等同于[x-z]。<br />例子：<br />var regx=/a[bc]d/;<br />var rs=regx.exec(“abddgg”);<br />结果：匹配成功，rs的值为：{abd}<br />例子2：<br />var regx=/a[bc]d/;<br />var rs=regx.exec(“abcd”);<br />结果：匹配失败，rs的值为：null，之所以失败，是因为[bc]表示匹配b或c中的一个，但不会同时匹配。</p>
		<p>17&gt;[^xyz]：该模式表示匹配非[]中的一个字符，形式上[^xyz]等同于[^x-z]。<br />例子：<br />var regx=/a[^bc]d/;<br />var rs=regx.exec(“afddgg”);<br />结果：匹配成功，rs的值为：{afd}<br />例子2：<br />var regx=/a[^bc]d/;<br />var rs=regx.exec(“abd”);<br />结果：匹配失败，rs的值为：。</p>
		<p>18&gt;[\b]：匹配退格键。</p>
		<p>19&gt;\b：匹配一个词的边界符，例如空格和换行符等等，当然匹配换行符时，表达式应该附加参数m。<br />例子：<br />var regx=/\bc./;<br />var rs=regx.exec(“Beijing is a beautiful city”);<br />结果：匹配成功，rs的值为：{ci}，注意c前边的空格不会匹配到结果中，即{ ci}是不正确的。</p>
		<p>20&gt;\B：代表一个非单词边界。<br />例子：<br />var regx=/\Bi./;<br />var rs=regx.exec(“Beijing is a beautiful city”);<br />结果：匹配成功，rs的值为：{ij}，即匹配了Beijing中的ij。</p>
		<p>21&gt;\cX，匹配一个控制字符。例如， \cM 匹配一个 Control-M 或 <br />回车符。 x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一 <br />个原义的 ’c’ 字符。（实际的例子还需补充） </p>
		<p>21&gt;\d：匹配一个数字字符，等同于[0-9]。<br />例子：<br />var regx=/user\d/;<br />var rs=regx.exec(“user1”);<br />结果：匹配成功，rs的值为：{user1}</p>
		<p>22&gt;\D：匹配一个非数字字符，等同于[^0-9]。<br />例子：<br />var regx=/user\D/;<br />var rs=regx.exec(“userA”);<br />结果：匹配成功，rs的值为：{userA}</p>
		<p>23&gt;\f：匹配一个换页符。</p>
		<p>24&gt;\n：匹配一个换行符。因为是换行符，所以在表达式中要加入m参数。<br />例子：<br />var regx=/a\nbc/m;<br />       var str=“a<br />               bc”;<br />       var rs=regx.exec(str);<br />       结果：匹配成功，rs的值为：{  }，如果表达式为/a\n\rbc/，则不会被匹配，因此在一般的编辑器中一个”Enter”键代表着“回车换行”，而非“换行回车”，至少在textarea域中是这样的。       <br />25&gt;\r：匹配一个回车符</p>
		<p>26&gt;\s：匹配一个空格符，等同于[ \f\n\r\t\v\u00A0\u2028\u2029].<br />例子：<br />var regx=/\si/;<br />var rs=regx.exec(“Beijing is a city”);<br />结果：匹配成功，rs的值为：{ i}</p>
		<p>27&gt;\S：匹配一个非空格符，等同于[ ^\f\n\r\t\v\u00A0\u2028\u2029].<br />例子：<br />var regx=/\Si/;<br />var rs=regx.exec(“Beijing is a city”);<br />结果：匹配成功，rs的值为：{ei}</p>
		<p>28&gt;\t：匹配一个tab<br />例子：<br />var regx=/a\tb/;<br />var rs=regx.exec(“a bc”);<br />结果：匹配成功，rs的值为： {a       bc} </p>
		<p>29&gt;\v：匹配一个竖向的tab</p>
		<p>30&gt;\w：匹配一个数字、_或字母表字符，即[A-Za-z0-9_ ]。<br />例子：<br />var regx=/\w/;<br />var rs=regx.exec(“$25.23”);<br />结果：匹配成功，rs的值为：{2}</p>
		<p>31&gt;\W：匹配一个非数字、_或字母表字符，即[^A-Za-z0-9_ ]。<br />例子：<br />var regx=/\w/;<br />var rs=regx.exec(“$25.23”);<br />结果：匹配成功，rs的值为：{$}</p>
		<p>32&gt;\n：注意不是\n，这里n是一个正整数，表示匹配第n个()中的字符。<br />例子：<br />var regx=/user([,-])group\1role/;<br />var rs=regx.exec(“user-group-role”);<br />结果：匹配成功，rs的值为：{user-group-role,-}，同样对user,group,role的匹配也是成功的，但像user-group,role等就不对了。</p>
		<p>33&gt;\0：匹配一个NUL字符。</p>
		<p>34&gt;\xhh：匹配一个由两位16进制数字所表达的字符。</p>
		<p>35&gt;\uhhhh：匹配一个由四位16进制数字所表达的字符。</p>
		<p>
				<br />
				<strong>3，表达式操作</strong>
		</p>
		<p>1）表达式操作，在这里是指和表达式相关的方法，我们将介绍六个方法。<br />2）表达式对象（RegExp）方法：</p>
		<p>1&gt;exec(str)，返回str中与表达式相匹配的第一个字符串，而且以数组的形式表现，当然如果表达式中含有捕捉用的小括号，则返回的数组中也可能含有()中的匹配字符串，例如：<br />var regx=/\d+/;<br />var rs=regx.exec(“3432ddf53”);<br />返回的rs值为：{3432}<br />var regx2=new RegExp(“ab(\d+)c”);<br />var rs2=regx2.exec(“ab234c44”);<br />返回的rs值为：{ab234c,234}<br />另外，如果有多个合适的匹配，则第一次执行exec返回一个第一个匹配，此时继续执行exec，则依次返回第二个第三个匹配。例如：<br />var regx=/user\d/g;<br />var rs=regx.exec(“ddduser1dsfuser2dd”);<br />var rs1=regx.exec(“ddduser1dsfuser2dd”);<br />则rs的值为{user1}，rs的值为{rs2}，当然注意regx中的g参数是必须的，否则无论exec执行多少次，都返回第一个匹配。后面还有相关内容涉及到对此想象的解释。</p>
		<p>2&gt;test(str)，判断字符串str是否匹配表达式，返回一个布尔值。例如：<br />var regx=/user\d+/g;<br />var flag=regx.test(“user12dd”);<br />flag的值为true。</p>
		<p>3）String对象方法</p>
		<p>1&gt;match(expr)，返回与expr相匹配的一个字符串数组，如果没有加参数g，则返回第一个匹配，加入参数g则返回所有的匹配<br />例子：<br />var regx=/user\d/g;<br />var str=“user13userddduser345”;<br />var rs=str.match(regx);<br />rs的值为：{user1,user3}</p>
		<p>2&gt;search(expr)，返回字符串中与expr相匹配的第一个匹配的index值。<br />例子：<br />var regx=/user\d/g;<br />var str=“user13userddduser345”;<br />var rs=str.search(regx);<br />rs的值为：0</p>
		<p>3&gt;replace(expr,str)，将字符串中匹配expr的部分替换为str。另外在replace方法中，str中可以含有一种变量符号$，格式为$n，代表匹配中被记住的第n的匹配字符串（注意小括号可以记忆匹配）。<br />例子：<br />var regx=/user\d/g;<br />var str=“user13userddduser345”;<br />var rs=str.replace(regx,”00”);<br />rs的值为：003userddd0045<br />例子2：<br />var regx=/u(se)r\d/g;<br />var str=“user13userddduser345”;<br />var rs=str.replace(regx,”$1”);<br />rs的值为：se3userdddse45<br />对于replace(expr,str)方法还要特别注意一点，如果expr是一个表达式对象则会进行全局替换（此时表达式必须附加参数g，否则也只是替换第一个匹配），如果expr是一个字符串对象，则只会替换第一个匹配的部分，例如：<br />var regx=“user”<br />var str=“user13userddduser345”;<br />var rs=str.replace(regx,”00”);<br />rs的值为： 0013userddduser345</p>
		<p>4&gt;split(expr)，将字符串以匹配expr的部分做分割，返回一个数组，而且表达式是否附加参数g都没有关系，结果是一样的。<br />例子：<br />var regx=/user\d/g;<br />var str=“user13userddduser345”;<br />var rs=str.split(regx);<br />rs的值为：{3userddd,45}</p>
		<p>
				<strong>4，表达式相关属性</strong>
		</p>
		<p>1）表达式相关属性，是指和表达式相关的属性，如下面的形式：<br />var regx=/myexpr/;<br />var rs=regx.exec(str);<br />其中，和表达式自身regx相关的属性有两个，和表达式匹配结果rs相关的属性有三个，下面将逐一介绍。<br />2）和表达式自身相关的两个属性：</p>
		<p>1&gt;lastIndex，返回开始下一个匹配的位置，注意必须是全局匹配（表达式中带有g参数）时，lastIndex才会有不断返回下一个匹配值，否则该值为总是返回第一个下一个匹配位置，例如：<br />var regx=/user\d/;<br />var rs=regx.exec(“sdsfuser1dfsfuser2”);<br />var lastIndex1=regx.lastIndex;<br />rs=regx.exec(“sdsfuser1dfsfuser2”);<br />var lastIndex2=regx.lastIndex;<br />rs=regx.exec(“sdsfuser1dfsfuser2”);<br />var lastIndex3=regx.lastIndex; <br />上面lastIndex1为9，第二个lastIndex2也为9，第三个也是9；如果regx=/user\d/g，则第一个为9，第二个为18，第三个为0。</p>
		<p>2&gt;source，返回表达式字符串自身。例如：<br />var regx=/user\d/;<br />var rs=regx.exec(“sdsfuser1dfsfuser2”);<br />var source=regx.source;<br />source的值为user\d<br />3）和匹配结果相关的三个属性：</p>
		<p>1&gt;index，返回当前匹配的位置。例如：<br />var regx=/user\d/;<br />var rs=regx.exec(“sdsfuser1dfsfuser2”);<br />var index1=rs.index;<br />rs=regx.exec(“sdsfuser1dfsfuser2”);<br />var index2=rs.index; <br />rs=regx.exec(“sdsfuser1dfsfuser2”);<br />var index3=rs.index; <br />index1为4，index2为4，index3为4，如果表达式加入参数g，则index1为4，index2为13，index3会报错（index为空或不是对象）。</p>
		<p>2&gt;input，用于匹配的字符串。例如：<br />var regx=/user\d/;<br />var rs=regx.exec(“sdsfuser1dfsfuser2”);<br />var input=rs.input;<br />input的值为sdsfuser1dfsfuser2。</p>
		<p>3&gt;[0]，返回匹配结果中的第一个匹配值，对于match而言可能返回一个多值的数字，则除了[0]外，还可以取[1]、[2]等等。例如：<br />var regx=/user\d/;<br />var rs=regx.exec(“sdsfuser1dfsfuser2”);<br />var value1=rs[0];<br />rs=regx.exec(“sdsfuser1dfsfuser2”);<br />var value2=rs[0]; <br />value1的值为user1,value2的值为user2</p>
		<p>
				<strong>5，实际应用</strong>
		</p>
		<p>1）实际应用一<br />描述：有一表单，其中有一个“用户名”input域<br />要求：汉字，而且不能少于2个汉字，不能多于4个汉字。<br />实现：<br />&lt;script&gt;<br />function checkForm(obj){<br />     var username=obj.username.value;<br />     var regx=/^[\u4e00-\u9fa5]{2,4}$/g<br />     if(!regx.test(username)){<br />               alert(“Invalid username!”);<br />               return false; <br />     }<br />     return true;<br />}<br />&lt;/script&gt;<br />&lt;form name=“myForm”onSubmit=“return checkForm(this)”&gt;<br />    &lt;input type=“text” name=“username”/&gt;<br />    &lt;input type=“submit” vlaue=“submit”/&gt;<br />&lt;/form&gt;<br />2）实际应用二<br />描述：给定一个含有html标记的字符串，要求将其中的html标记去掉。<br />实现：<br />&lt;script&gt;<br />function toPlainText(htmlStr){<br />     var regx=/&lt;[^&gt;]*&gt;|&lt;\/[^&gt;]*&gt;/gm;<br />     var str=htmlStr.replace(regx,"");<br />     return str;<br />}<br />&lt;/script&gt;<br />&lt;form name=“myForm”&gt;<br />    &lt;textarea id=“htmlInput”&gt;&lt;/textarea&gt;<br />    &lt;input type=“button” value=“submit” onclick=“toPlainText(document.getElementById(‘htmlInput’).value”/&gt;<br />&lt;/form&gt;</p>
		<p>
				<strong>
						<font size="5">三，小结</font>
				</strong>
		</p>
		<p>1，Javascript正则表达式，我想在一般的程序员之中，使用者应该不是很多，因为我们处理的页面一般都不是很复杂，而复杂的逻辑一般我们都在后台处理完成了。但是目前趋势已经出现了扭转，富客户端已经被越来越多的人接受，而Javascript就是其中的关键技术，对于复杂的客户端逻辑而言，正则表达式的作用也是很关键的，同时它也是Javascript高手必须要掌握的重要技术之一。 </p>
		<p>2，为了能够便于大家对前面讲述的内容有一个更为综合和深刻的认识，我将前面的一些关键点和容易犯糊涂的地方再系统总结一下，这部分很关键！<br /><strong>总结1：附件参数g的用法</strong><br />表达式加上参数g之后，表明可以进行全局匹配，注意这里“可以”的含义。我们详细叙述：<br />1）对于表达式对象的exec方法，不加入g，则只返回第一个匹配，无论执行多少次均是如此，如果加入g，则第一次执行也返回第一个匹配，再执行返回第二个匹配，依次类推。例如<br />var regx=/user\d/;<br />var str=“user18dsdfuser2dsfsd”;<br />var rs=regx.exec(str);//此时rs的值为{user1}<br />var rs2=regx.exec(str);//此时rs的值依然为{user1}<br />如果regx=/user\d/g；则rs的值为{user1}，rs2的值为{user2}<br />通过这个例子说明：对于exec方法，表达式加入了g，并不是说执行exec方法就可以返回所有的匹配，而是说加入了g之后，我可以通过某种方式得到所有的匹配，这里的“方式”对于exec而言，就是依次执行这个方法即可。<br />2）对于表达式对象的test方法，加入g于不加上g没有什么区别。<br />3）对于String对象的match方法，不加入g，也只是返回第一个匹配，一直执行match方法也总是返回第一个匹配，加入g，则一次返回所有的匹配（注意这与表达式对象的exec方法不同，对于exec而言，表达式即使加上了g，也不会一次返回所有的匹配）。例如：<br />var regx=/user\d/;<br />var str=“user1sdfsffuser2dfsdf”;<br />var rs=str.match(regx);//此时rs的值为{user1}<br />var rs2=str.match(regx);//此时rs的值依然为{user1}<br />如果regx=/user\d/g，则rs的值为{user1,user2}，rs2的值也为{user1,user2}<br />4）对于String对象的replace方法，表达式不加入g，则只替换第一个匹配，如果加入g，则替换所有匹配。（开头的三道测试题能很好的说明这一点）<br />5）对于String对象的split方法，加上g与不加g是一样的，即：<br />var sep=/user\d/;<br />var array=“user1dfsfuser2dfsf”.split(sep);<br />则array的值为{dfsf, dfsf}<br />此时sep=/user\d/g，返回值是一样的。<br />6）对于String对象的search方法，加不加g也是一样的。<br /><strong>总结2：附加参数m的用法</strong><br />附加参数m，表明可以进行多行匹配，但是这个只有当使用^和$模式时才会起作用，在其他的模式中，加不加入m都可以进行多行匹配（其实说多行的字符串也是一个普通字符串），我们举例说明这一点<br />1）使用^的例子<br />var regx=/^b./g;<br />var str=“bd76 dfsdf<br />         sdfsdfs dffs<br />         b76dsf  sdfsdf”;<br />var rs=str.match(regx);<br />此时加入g和不加入g，都只返回第一个匹配{bd}，如果regx=/^b./gm，则返回所有的匹配{bd,b7}，注意如果regx=/^b./m，则也只返回第一个匹配。所以，加入m表明可以进行多行匹配，加入g表明可以进行全局匹配，综合到一起就是可以进行多行全局匹配<br />2）使用其他模式的例子，例如<br />var regx=/user\d/;<br />var str=“sdfsfsdfsdf<br />         sdfsuser3 dffs<br />         b76dsf  user6”;<br />var rs=str.match(regx);<br />此时不加参数g，则返回{user3}，加入参数g返回{user3,user6}，加不加入m对此没有影响。<br />3）因此对于m我们要清楚它的使用，记住它只对^和$模式起作用，在这两种模式中，m的作用为：如果不加入m，则只能在第一行进行匹配，如果加入m则可以在所有的行进行匹配。我们再看一个^的例子<br />var regx=/^b./;<br />var str=“ret76 dfsdf<br />         bjfsdfs dffs<br />         b76dsf  sdfsdf”;<br />var rs=str.match(regx);<br />此时rs的值为null，如果加入g，rs的值仍然为null，如果加入m，则rs的值为{bj}（也就是说，在第一行没有找到匹配，因为有参数m，所以可以继续去下面的行去找是否有匹配），如果m和g都加上，则返回{bj,b7}（只加m不加g说明，可以去多行进行匹配，但是找到一个匹配后就返回，加入g表明将多行中所有的匹配返回，当然对于match方法是如此，对于exec呢，则需要执行多次才能依次返回）<br /><strong>总结3</strong>：在HTML的textarea输入域中，按一个Enter键，对应的控制字符为“\r\n”，即“回车换行”，而不是“\n\r”，即“换行回车”，我们看一个前面我们举过的例子：<br />var regx=/a\r\nbc/;<br />var str=“a<br />         bc”;<br />var rs=regx.exec(str);<br />结果：匹配成功，rs的值为：{      }，如果表达式为/a\n\rbc/，则不会被匹配，因此在一般的编辑器中一个”Enter”键代表着“回车换行”，而非“换行回车”，至少在textarea域中是这样的。</p>
		<p>
				<strong>
						<font size="5">四，应用案例</font>
				</strong>
		</p>
		<p>
				<strong>1，正则表达式使用场景：</strong>
				<br />1）登录场景，检查用户输入的用户名，要求：<br />字符长度在6到18之间<br />字符必须为字母、数字或者下划线的组合<br />2）购物场景，对于商品列表的描述（标签、条形码、单价）等有些用户可能会提出下面需求：<br />希望可以对商品列表的某一列描述进行字号的自定义，而且下次登录仍然保持用户的修改<br /><strong>2，下面看一下在上述两个场景中，正则表达式的使用方式和具体实现。<br /></strong>1）登录场景部分正则表达式实现<br /><img alt="" src="file:///D:/_DataBank/_WBE_URL/_JS/Javascript高级培训－正则表达式.files/regexp_1.gif" /><br />2）购物场景部分正则表达式实现<br />1&gt;需求分析：用户希望可以对商品列表的某一列描述进行字号的自定义，而且下次登录仍然保持用户的修改<br /><img alt="" src="file:///D:/_DataBank/_WBE_URL/_JS/Javascript高级培训－正则表达式.files/regexp_2.gif" /><br />2&gt;程序设计<br /><img alt="" src="file:///D:/_DataBank/_WBE_URL/_JS/Javascript高级培训－正则表达式.files/regexp_3.gif" /><br />类图：<br /><img alt="" src="file:///D:/_DataBank/_WBE_URL/_JS/Javascript高级培训－正则表达式.files/regexp_4.gif" /><br />3&gt;代码实现<br />PageSetting类<br /><img alt="" src="file:///D:/_DataBank/_WBE_URL/_JS/Javascript高级培训－正则表达式.files/regexp_5.gif" /><br />PageSettingParser类<br /><img alt="" src="file:///D:/_DataBank/_WBE_URL/_JS/Javascript高级培训－正则表达式.files/regexp_6.gif" /><br />注：如果需要上面的应用案例的工程，请发email给我。</p>
<img src ="http://www.blogjava.net/19851985lili/aggbug/97620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-02-02 19:38 <a href="http://www.blogjava.net/19851985lili/articles/97620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用正则表达式 </title><link>http://www.blogjava.net/19851985lili/articles/93482.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Fri, 12 Jan 2007 08:47:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/93482.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/93482.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/93482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/93482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/93482.html</trackback:ping><description><![CDATA[
		<br />
		<div style="MARGIN-TOP: 1px; MARGIN-LEFT: 15px">
				<h2>
						<a title="永久链接：常用正则表达式" href="http://yanxiaohui5522.javaeye.com/blog/43220">常用正则表达式</a>
				</h2>
		</div>
		<div style="MARGIN-TOP: 10px; MARGIN-LEFT: 15px">
				<table width="100%">
						<tbody>
								<tr>
										<td>
												<p>
												</p>
												<div class="code_title">代码</div>
												<div class="code_div">
														<div class="dp-highlighter">
																<div class="bar">
																</div>
																<ol class="dp-j">
																		<li class="alt">
																				<span>
																						<span class="string">"^\d+$"</span>
																						<span>　　</span>
																						<span class="comment">//非负整数（正整数 + 0） </span>
																						<span>  </span>
																				</span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^[0-9]*[1-9][0-9]*$"</span>
																				<span>　　</span>
																				<span class="comment">//正整数 </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^((-\d+)|(0+))$"</span>
																				<span>　　</span>
																				<span class="comment">//非正整数（负整数 + 0） </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^-[0-9]*[1-9][0-9]*$"</span>
																				<span>　　</span>
																				<span class="comment">//负整数 </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^-?\d+$"</span>
																				<span>　　　　</span>
																				<span class="comment">//整数 </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^\d+(\.\d+)?$"</span>
																				<span>　　</span>
																				<span class="comment">//非负浮点数（正浮点数 + 0） </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"</span>
																				<span>　　</span>
																				<span class="comment">//正浮点数 </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"</span>
																				<span>　　</span>
																				<span class="comment">//非正浮点数（负浮点数 + 0） </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"</span>
																				<span>　　</span>
																				<span class="comment">//负浮点数 </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^(-?\d+)(\.\d+)?$"</span>
																				<span>　　</span>
																				<span class="comment">//浮点数 </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^[A-Za-z]+$"</span>
																				<span>　　</span>
																				<span class="comment">//由26个英文字母组成的字符串 </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^[A-Z]+$"</span>
																				<span>　　</span>
																				<span class="comment">//由26个英文字母的大写组成的字符串 </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^[a-z]+$"</span>
																				<span>　　</span>
																				<span class="comment">//由26个英文字母的小写组成的字符串 </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^[A-Za-z0-9]+$"</span>
																				<span>　　</span>
																				<span class="comment">//由数字和26个英文字母组成的字符串 </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^\w+$"</span>
																				<span>　　</span>
																				<span class="comment">//由数字、26个英文字母或者下划线组成的字符串 </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"</span>
																				<span>　　　　</span>
																				<span class="comment">//email地址 </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="string">"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"</span>
																				<span>　　//url    </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的网络链接: </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>(h|H)(r|R)(e|E)(f|F)  *=  *('|</span>
																				<span class="string">")?(\w|\\|\/|\.)+('|"</span>
																				<span>|  *|&gt;)?     </span>
																		</li>
																		<li class="alt">
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的邮件地址: </span>
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*     </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的图片链接: </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>(s|S)(r|R)(c|C)  *=  *('|</span>
																				<span class="string">")?(\w|\\|\/|\.)+('|"</span>
																				<span>|  *|&gt;)?   </span>
																		</li>
																		<li class="alt">
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的IP地址:   </span>
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>(\d+)\.(\d+)\.(\d+)\.(\d+)       </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的中国手机号码: </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>(</span>
																				<span class="number">86</span>
																				<span>)*</span>
																				<span class="number">0</span>
																				<span>*</span>
																				<span class="number">13</span>
																				<span>\d{</span>
																				<span class="number">9</span>
																				<span>}       </span>
																		</li>
																		<li class="alt">
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的中国固定电话号码: </span>
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>(\(\d{</span>
																				<span class="number">3</span>
																				<span>,</span>
																				<span class="number">4</span>
																				<span>}\)|\d{</span>
																				<span class="number">3</span>
																				<span>,</span>
																				<span class="number">4</span>
																				<span>}-|\s)?\d{</span>
																				<span class="number">8</span>
																				<span>}       </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的中国电话号码（包括移动和固定电话）: </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>(\(\d{</span>
																				<span class="number">3</span>
																				<span>,</span>
																				<span class="number">4</span>
																				<span>}\)|\d{</span>
																				<span class="number">3</span>
																				<span>,</span>
																				<span class="number">4</span>
																				<span>}-|\s)?\d{</span>
																				<span class="number">7</span>
																				<span>,</span>
																				<span class="number">14</span>
																				<span>}       </span>
																		</li>
																		<li class="alt">
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的中国邮政编码: </span>
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>[</span>
																				<span class="number">1</span>
																				<span>-</span>
																				<span class="number">9</span>
																				<span>]{</span>
																				<span class="number">1</span>
																				<span>}(\d+){</span>
																				<span class="number">5</span>
																				<span>}       </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的中国身份证号码: </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>\d{</span>
																				<span class="number">18</span>
																				<span>}|\d{</span>
																				<span class="number">15</span>
																				<span>}       </span>
																		</li>
																		<li class="alt">
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的整数： </span>
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>\d+       </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的浮点数（即小数）： </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>(-?\d*)\.?\d+       </span>
																		</li>
																		<li class="alt">
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的任何数字  ： </span>
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>(-?\d*)(\.\d+)?     </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的中文字符串： </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>[\u4e00-\u9fa5]*       </span>
																		</li>
																		<li class="alt">
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的双字节字符串  (汉字)： </span>
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>[^\x00-\xff]*     </span>
																		</li>
																		<li class="">
																				<span>  </span>
																		</li>
																		<li class="alt">
																				<span>
																				</span>
																				<span class="comment">//提取信息中的英文字符串： </span>
																				<span>  </span>
																		</li>
																		<li class="">
																				<span>\w*  </span>
																		</li>
																</ol>
														</div>
												</div>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
<img src ="http://www.blogjava.net/19851985lili/aggbug/93482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-01-12 16:47 <a href="http://www.blogjava.net/19851985lili/articles/93482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>