正则表达式练习器

复制代码 代码如下:

<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] = \”$\”+i+\”:\”+matchArray[i]
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(\”\\r\\n\”)
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 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])[-./](\\d\\d\\d\\d))
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>



对正则表达式练习器的改进,原贴ID901680


覆盖原execIt函数
修改后的execIt函数允许对多个正则表达式进行匹配(每个正则表达式一行),并对每一个匹配成分显示出是第几个正则表达式匹配的。
这可视为语法分析的雏形,只要对匹配产生相应的动作。


function execIt(form) {
var mode
if(form.chkmode.checked) mode = \”gi\”
else mode = \”g\”
var regexpArray = form.regexp.value.split(\”\\r\\n\”) //获取正则表达式到数组


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[i],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] = \”$\”+i+\”:\”+matchArray[i]
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)
}