正则表达式练习器

复制代码 代码如下:

  <HTML>

  <HEAD>

  <TITLE>正则表达式练习器</TITLE>

  <meta name = 安徽 池州 统计局 徐祖宁 e-mail:[email protected]>

  <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:[email protected]>[email protected]</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 [email protected]

  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)

  }