5D艺术网首页
商城
|
资讯
|
作品
|
博客
|
教程
|
论坛
登录
注册
加为好友
发短消息
来自:
性别:秘密
最后登录:2017-08-08
http://allinhands.5d.cn/
首页
|
新闻
|
话题
|
博客
|
相册
|
艺术作品
|
社交关系
|
留言板
|
社交圈
2004/07/28 | 正则表达式练习器
类别(JScript)
|
评论
(0)
|
阅读(93)
|
发表于 16:53
正则表达式的用途很广泛,但要熟练掌握就不是一件容易的事情了。为此,我编写了这个练习器用来帮助学习。
请多指教!
*********将以下代码复制到 RegExp.htm 即可 **********
<HTML> <HEAD> <TITLE>正则表达式练习器</TITLE> <meta name = 安徽 池州 统计局 徐祖宁 e-mail:czjsz@stats.gov.cn> <script language="javascript"> function OnMove() { window.status = "("+window.event.clientX+","+window.event.clientY+")" + " :: "+document.location } </script> <SCRIPT LANGUAGE="javascript1.2"> var re = new RegExp() //建立正则表达式对象 var nextpoint = 0 //匹配时的偏移量 //设置正则表达式 function setPattern(form) { var mode if(form.chkmode.checked) mode = "gi" //i:不分大小写 g:全局,好象没什么作用 else mode = "g" re.compile(form.regexp.value,mode) nextpoint = 0 form.reglist.value = "" } //检查是否有匹配 function findIt(form) { setPattern(form) var input = form.main.value if (input.search(re) != -1) { form.output[0].checked = true } else { form.output[1].checked = true } } //检查匹配位置 function locateIt(form) { setPattern(form) var input = form.main.value form.offset.value = input.search(re) } //检查所有的匹配情况 function execIt(form) { if(nextpoint == 0 || ! form.scankmode.checked) { findIt(form) form.reglist.value = "" } var key = true if(form.scankmode.checked) key = false do { var input = form.main.value var matchArray = re.exec(input.substr(nextpoint)) if(matchArray) { for(var i=1;i<matchArray.length;i++) matchArray = "$"+i+":"+matchArray form.reglist.value = (nextpoint+matchArray.index)+" => " + matchArray[0] +"n"+form.reglist.value form.matchlist.value = "$0:"+matchArray.join("n") nextpoint = nextpoint + matchArray.index + matchArray[0].length }else { if(!key) form.reglist.value = "没有找到n" + form.reglist.value form.matchlist.value = " " nextpoint = 0 key = false } }while (key) } //设置当前使用的正则表达式 function setregexp(n) { var s = document.all.regexplist.value.split("rn") document.all.regexp.value = s[n*2-1] //.replace("r","") nextpoint = 0 } //定义选择监视 var isNav = (navigator.appName == "Netscape") function showSelection() { if (isNav) { var theText = document.getSelection() } else { var theText = document.selection.createRange().text } if(theText.length>0 && document.all.selechkmode.checked) document.all.regexp.value = theText } if (isNav) { document.captureEvents(Event.MOUSEUP) } document.onmouseup = showSelection </SCRIPT> </HEAD> <BODY style="font-size=9pt;" onMouseMove=OnMove()> <FORM><table width=100% cellspacing=0 cellpadding=0><tr><td><font color=red>正规表达式练习器</font></td><td align=right><a href=mailto:czjsz_ah@stats.gov.cn>czjsz_ah@stats.gov.cn</a></td></tr></table> <table width=100% broder=1 frame=above rules=none style="font-size:9pt;"> <tr><td width=50% valign=top> 输入一些被寻找的正文:<BR> <TEXTAREA NAME="main" COLS=58 ROWS=5 WRAP="virtual" style="font-size:9pt;"> 09-11-2001 09/11/2001 czjsz_ah@stats.gov.cn asdff 12345 196.168.1.3 http://www.sohu.com ftp://www.chinaasp.com 2001.9.11 http://www.active.com.cn/club/bbs/bbsView.asp http://www.163.com/inden.htm </TEXTAREA><BR> 进行匹配的正规表达式: 忽略大小写<INPUT TYPE="checkbox" NAME="chkmode" checked style="font-size:8pt;height:18px"><BR> <TEXTAREA NAME="regexp" COLS=51 ROWS=5 style="font-size:9pt;"></TEXTAREA> <INPUT TYPE="button" value="清除" onClick="this.form.regexp.value=''" style="font-size:8pt;height:18px"><BR> <INPUT TYPE="button" value="能找到吗?[regexObject.test(string)]" style="font-size:8pt;width:70%;height:18px" onClick="findIt(this.form)"> <INPUT TYPE="radio" NAME="output" style="font-size:8pt;height:18px">Yes <INPUT TYPE="radio" NAME="output" style="font-size:8pt;height:18px">No <BR> <INPUT TYPE="button" value="在哪里?[string.search(regexObject)]" style="font-size:8pt;width:70%;height:18px" onClick="locateIt(this.form)"> <INPUT TYPE="text" NAME="offset" SIZE=4 style="font-size:8pt;height:18px"> </td> <td valign=top> 测试用正则表达式列表: 使用第<input type=text name=num size=2 value=1 style="font-size:8pt;height:18px">个<input type=button value=Go onClick=setregexp(this.form.num.value) style="font-size:8pt;height:18px"> 允许复制<INPUT TYPE="checkbox" NAME="selechkmode" style="font-size:8pt;height:18px"> <textarea NAME="regexplist" cols=58 rows=14 wrap=off style="font-size:9pt;"> 1.检查日期: (1[0-2]|0?[1-9])[-./](0?[1-9]|[12][0-9]|3[01])[-./](dddd)) 2.检查数字: ([-+]?[0-9]+.?[0-9]+) 3.检查URL: ((http|ftp)://)?(((([d]+.)+){3}[d]+(/[w./]+)?)|([a-z]w*((.w+)+){2,})([/][w.~]*)*) 4.检查E-mail w+@((w+[.]?)+) </textarea> </td></tr> <tr><td valign=bottom> <INPUT TYPE="button" value="有哪些?[regexObject.exec(string)]" style="font-size:8pt;width:70%;height:18px" onClick="execIt(this.form)"> 单步<INPUT TYPE="checkbox" NAME="scankmode" style="font-size:8pt;height:18px"><BR> <TEXTAREA NAME="reglist" COLS=58 ROWS=8 style="font-size:9pt;"></TEXTAREA> </td> <td valign=bottom> 匹配到的成分:(单步时可见) <TEXTAREA NAME="matchlist" COLS=58 ROWS=8 style="font-size:9pt;"></TEXTAREA> </td></tr></table></FORM> <script> setregexp(1) </script> </BODY> </HTML>
[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]
对正则表达式练习器的改进,原贴ID901680
覆盖原execIt函数
修改后的execIt函数允许对多个正则表达式进行匹配(每个正则表达式一行),并对每一个匹配成分显示出是第几个正则表达式匹配的。
这可视为语法分析的雏形,只要对匹配产生相应的动作。
function execIt(form) {
var mode
if(form.chkmode.checked) mode = "gi"
else mode = "g"
var regexpArray = form.regexp.value.split("rn") //获取正则表达式到数组
if(nextpoint == 0) form.reglist.value = ""
var key = true
if(form.scankmode.checked) key = false
else nextpoint = 0
do {
var offs = 9999999999
var pos = -1
var input = form.main.value.substr(nextpoint)
//对每个正则表达式进行匹配
for(var i=0;i<regexpArray.length;i++) {
re.compile(regexpArray,mode)
var matchArray = re.exec(input)
if(matchArray) {
if(offs > matchArray.index) {
offs = matchArray.index
pos = i //保存距离起始位子最近的匹配
}
}
}
if(pos>=0) {
re.compile(regexpArray[pos],mode)
var matchArray = re.exec(input)
for(var i=1;i<matchArray.length;i++)
matchArray = "$"+i+":"+matchArray
form.reglist.value = "["+(pos+1)+"]"+(nextpoint+matchArray.index)+" => " + matchArray[0] +"n"+form.reglist.value
form.matchlist.value = "$0:"+matchArray.join("n")
nextpoint = nextpoint + matchArray.index + matchArray[0].length
}else {
if(!key)
form.reglist.value = "没有找到n" + form.reglist.value
form.matchlist.value = " "
nextpoint = 0
key = false
}
}while(key)
}
0
评论
Comments
日志分类
首页
[102]
.Net
[11]
VBScript
[1]
JScript
[51]
XML
[3]
HTML&CSS
[9]
ASP
[8]
ActiveX
[4]
Software
[10]
Other
[5]