shawl.qiu Javascript 正则调试器 RegExpBox 2007-9-4
说明:
其实这个很容易写的, 不过还有一点特色.
就是嘛, 可以一次执行多条语句, 类似于批处理, 这也正是目前许多正则调试器所欠缺的一个功能, 但是这个功能真的很重要...
shawl.qiu
2007-09-05
http://blog.csdn.net/btbtd
演示:
http://files.myopera.com/btbtd/javascript/RegExpBox/2007_9_4/RegExpBox.htm
内容:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>RegExpBox - shawl.qiu template </title>
<style type="text/css">
/* <![CDATA[ */
/* ]]> */
</style>
<script type="text/javascript">
/*<![CDATA[*/
if (navigator.appName=="Microsoft Internet Explorer")
{
//最大化窗口
self.moveTo(-5,-5)
self.resizeTo(screen.availWidth +8,screen.availHeight+8)
//这个脚本定义的宽度其实比原窗口还要大那么一点.
}
/*]]*/
</script>
</head>
<body>
<form id="MainForm">
<div id="Set0">
<p> 输入: <br />
<textarea cols="90%" rows="5" id="InputTxa"> #if
#else
#elif
#endif
123456
#define
#undef
#warning
#error
#line
#region
#endregion </textarea>
</p>
</div>
<div id="Set1">
<p>
<input type="submit" id="Submiter" value="提交" />
<input type="reset" value="重置" />
| Debug: <input type="checkbox" id="DebugCbx" />
</p>
</div>
<div id="Set2">
<p>输出: <br />
<textarea cols="90%" rows="10" id="OutputTxa"> </textarea>
</p>
</div>
<div id="Set3">
</div>
<div id="Set4">
<textarea cols="90%" rows="5" id="PtrTxa">//s+/g
/n
//#/g
/t# </textarea>
<!-- <textarea cols="90%" rows="5" id="PtrTxa"></textarea>-->
<br/>
单行对应替换正则, 双行对应结果正则.
</div>
<div id="Set5">
Pattern:
<br/>
</div>
<div id="Set6">
<input type="radio" name="FuncRdo" value="Trim" />:Trim
| <input type="radio" name="FuncRdo" value="LTrim" />:LTrim
| <input type="radio" name="FuncRdo" value="RTrim" />:RTrim
| <input type="radio" name="FuncRdo" value="Clear" />:Clear
<br/> <input type="radio" name="FuncRdo" value="Trim_M" />:Trim_M
| <input type="radio" name="FuncRdo" value="LTrim_M" />:LTrim_M
| <input type="radio" name="FuncRdo" value="RTrim_M" />:RTrim_M
<br/> <input type="radio" name="FuncRdo" value="Number" />:Number
</div>
</form>
<script type="text/javascript">
/*<![CDATA[*/
var Set = [];
var SetLen = 7;
for(var i=0; i<SetLen; i++) Set.push(document.getElementById("Set"+i));
var SetOrder = [0, 5, 4, 1, 6, 2, 3];
var Parent = Set[0].parentNode;
for(var i=0; i<SetLen; i++) Parent.removeChild(Set[i]);
for(var i=0; i<SetLen; i++) Parent.appendChild(Set[SetOrder[i]]);
var InputTxa = document.getElementById("InputTxa");
var OutputTxa = document.getElementById("OutputTxa");
var Submiter = document.getElementById("Submiter");
var PtrTxa = document.getElementById("PtrTxa");
var DebugCbx = document.getElementById("DebugCbx");
var FuncRdoRange = document.getElementsByName("FuncRdo");
Submiter.onclick =
function()
{
var Result = InputTxa.value;
PtrTxa.value = fClearLine(PtrTxa.value, 1);
var PtrAr = PtrTxa.value.split("/n");
var Len = PtrAr.length;
if(Len.length%2===0) throw new Error("错误的正则模式, 模式必须以行为单位, 成对出现!");
for(var i=0; i<Len; i++)
{
//Result = Result.replace(/^/s+|/s+$/g, "");
var Ptr = [];
PtrAr[i].replace
(
/^.*?//([/s/S]*)//([gim]*)/i,
function($0, $1, $2)
{
// $1 = $1.replace(/^[/r/n]+|[/r/n]+$/g, "");
// $2 = $2.replace(/^[/r/n]+|[/r/n]+$/g, "");
Ptr.push($1);
Ptr.push($2);
//alert(fListCharcode($2));
}
);
//alert(Ptr.length)
if(Ptr.length!=2) throw new Error("错误的替换模式!");
//Ptr[0] = Ptr[0].replace(/(//|/+)/g, "//$1");
Ptr[1] = Ptr[1].replace(//s+/g, "");
//Ptr[1] = Ptr[1].replace(///n/g, "/n");
//alert(PtrAr[TempI])
var Re = new RegExp(Ptr[0]+"", Ptr[1]+"");
var TempI = i+1;
PtrAr[TempI] = PtrAr[TempI]
.replace(///n/g, "/n")
.replace(///r/g, "/r")
.replace(///f/g, "/f")
.replace(///t/g, "/t")
.replace(///v/g, "/v")
;
Result = Result.replace(Re, PtrAr[TempI]);
i+=1;
}
Result = Result.replace(//r/g, "");
OutputTxa.value = Result;
if(DebugCbx.checked)
{
alert(fListCharcode(Result));
}
//alert(fListCharcode(Result));
return false;
};
var RdoLen = FuncRdoRange.length;
while(--RdoLen>-1)
{
var Rdo = FuncRdoRange[RdoLen];
Rdo.onclick =
function()
{
if(this.checked)
{
switch(this.value)
{
case "Trim":
PtrTxa.value = "/^//s+|//s+$/g/n";
break;
case "LTrim":
PtrTxa.value = "/^//s+/g/n";
break;
case "RTrim":
PtrTxa.value = "///s+$/g/n";
break;
case "Trim_M":
PtrTxa.value = "/^[^//r//n//S]+|[^//r//n//S]+$/gm/n";
break;
case "LTrim_M":
PtrTxa.value = "/^[^//r//n//S]+/gm/n";
break;
case "RTrim_M":
PtrTxa.value = "///s+$/gm/n";
break;
case "Number":
PtrTxa.value = "/([//d]+)$/gm/n$1";
break;
default:
PtrTxa.value = "//g/n";
break;
}
}
}
}
function fClearLine(Source, iProtect, bDebug)
{// shawl.qiu code : return string || void return
var bStr = false;
if(!iProtect) iProtect = 0;
if(Source.constructor==String) Source = [Source], bStr = true;
var sPtr = "[//s]*?//n";
var sFianlPtr = fRepeatString(sPtr, iProtect);
var TempAr = ["(//n", sFianlPtr, ")", "[//s]*//n"];
var TempRe = new RegExp(TempAr.join(""), "g");
Source[0] = Source[0].replace(TempRe, "$1");
if(bDebug)
{
document.write("sFianlPtr: ", sFianlPtr, "<br/>");
}
if(bStr) return Source[0];
function fRepeatString(sIpt, iLen)
{// shawl.qiu script
if(!sIpt)return "";
if(!iLen&&iLen!==0) iLen = 2;
iLen -= 0;
return new Array(iLen+1).join(sIpt);
} // end function fRepeatStr
} // end function fClearLine(Source, iProtect, bDebug)
function fListCharcode(Source)
{// shawl.qiu code : return string
var bStr = false;
if(Source.constructor==String) Source = [Source], bStr = true;
var Len = Source[0].length;
var Ar = [];
var TempAr = [];
for(var i=0; i<Len; i++)
{
var CurChar = Source[0].charAt(i);
//alert(CurChar)
Ar.push(CurChar);
TempAr.push(CurChar.charCodeAt());
if(CurChar.charCodeAt()==10||i===Len-1)
{
Ar.push(TempAr.join(","));
Ar.push("/n");
TempAr = [];
}
}
Source[0] = Ar.join("");
if(bStr) return Source[0];
} // end function fListCharcode(Source)
/*]]*/
</script>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>RegExpBox - shawl.qiu template </title>
<style type="text/css">
/* <![CDATA[ */
/* ]]> */
</style>
<script type="text/javascript">
/*<![CDATA[*/
if (navigator.appName=="Microsoft Internet Explorer")
{
//最大化窗口
self.moveTo(-5,-5)
self.resizeTo(screen.availWidth +8,screen.availHeight+8)
//这个脚本定义的宽度其实比原窗口还要大那么一点.
}
/*]]*/
</script>
</head>
<body>
<form id="MainForm">
<div id="Set0">
<p> 输入: <br />
<textarea cols="90%" rows="5" id="InputTxa"> #if
#else
#elif
#endif
123456
#define
#undef
#warning
#error
#line
#region
#endregion </textarea>
</p>
</div>
<div id="Set1">
<p>
<input type="submit" id="Submiter" value="提交" />
<input type="reset" value="重置" />
| Debug: <input type="checkbox" id="DebugCbx" />
</p>
</div>
<div id="Set2">
<p>输出: <br />
<textarea cols="90%" rows="10" id="OutputTxa"> </textarea>
</p>
</div>
<div id="Set3">
</div>
<div id="Set4">
<textarea cols="90%" rows="5" id="PtrTxa">//s+/g
/n
//#/g
/t# </textarea>
<!-- <textarea cols="90%" rows="5" id="PtrTxa"></textarea>-->
<br/>
单行对应替换正则, 双行对应结果正则.
</div>
<div id="Set5">
Pattern:
<br/>
</div>
<div id="Set6">
<input type="radio" name="FuncRdo" value="Trim" />:Trim
| <input type="radio" name="FuncRdo" value="LTrim" />:LTrim
| <input type="radio" name="FuncRdo" value="RTrim" />:RTrim
| <input type="radio" name="FuncRdo" value="Clear" />:Clear
<br/> <input type="radio" name="FuncRdo" value="Trim_M" />:Trim_M
| <input type="radio" name="FuncRdo" value="LTrim_M" />:LTrim_M
| <input type="radio" name="FuncRdo" value="RTrim_M" />:RTrim_M
<br/> <input type="radio" name="FuncRdo" value="Number" />:Number
</div>
</form>
<script type="text/javascript">
/*<![CDATA[*/
var Set = [];
var SetLen = 7;
for(var i=0; i<SetLen; i++) Set.push(document.getElementById("Set"+i));
var SetOrder = [0, 5, 4, 1, 6, 2, 3];
var Parent = Set[0].parentNode;
for(var i=0; i<SetLen; i++) Parent.removeChild(Set[i]);
for(var i=0; i<SetLen; i++) Parent.appendChild(Set[SetOrder[i]]);
var InputTxa = document.getElementById("InputTxa");
var OutputTxa = document.getElementById("OutputTxa");
var Submiter = document.getElementById("Submiter");
var PtrTxa = document.getElementById("PtrTxa");
var DebugCbx = document.getElementById("DebugCbx");
var FuncRdoRange = document.getElementsByName("FuncRdo");
Submiter.onclick =
function()
{
var Result = InputTxa.value;
PtrTxa.value = fClearLine(PtrTxa.value, 1);
var PtrAr = PtrTxa.value.split("/n");
var Len = PtrAr.length;
if(Len.length%2===0) throw new Error("错误的正则模式, 模式必须以行为单位, 成对出现!");
for(var i=0; i<Len; i++)
{
//Result = Result.replace(/^/s+|/s+$/g, "");
var Ptr = [];
PtrAr[i].replace
(
/^.*?//([/s/S]*)//([gim]*)/i,
function($0, $1, $2)
{
// $1 = $1.replace(/^[/r/n]+|[/r/n]+$/g, "");
// $2 = $2.replace(/^[/r/n]+|[/r/n]+$/g, "");
Ptr.push($1);
Ptr.push($2);
//alert(fListCharcode($2));
}
);
//alert(Ptr.length)
if(Ptr.length!=2) throw new Error("错误的替换模式!");
//Ptr[0] = Ptr[0].replace(/(//|/+)/g, "//$1");
Ptr[1] = Ptr[1].replace(//s+/g, "");
//Ptr[1] = Ptr[1].replace(///n/g, "/n");
//alert(PtrAr[TempI])
var Re = new RegExp(Ptr[0]+"", Ptr[1]+"");
var TempI = i+1;
PtrAr[TempI] = PtrAr[TempI]
.replace(///n/g, "/n")
.replace(///r/g, "/r")
.replace(///f/g, "/f")
.replace(///t/g, "/t")
.replace(///v/g, "/v")
;
Result = Result.replace(Re, PtrAr[TempI]);
i+=1;
}
Result = Result.replace(//r/g, "");
OutputTxa.value = Result;
if(DebugCbx.checked)
{
alert(fListCharcode(Result));
}
//alert(fListCharcode(Result));
return false;
};
var RdoLen = FuncRdoRange.length;
while(--RdoLen>-1)
{
var Rdo = FuncRdoRange[RdoLen];
Rdo.onclick =
function()
{
if(this.checked)
{
switch(this.value)
{
case "Trim":
PtrTxa.value = "/^//s+|//s+$/g/n";
break;
case "LTrim":
PtrTxa.value = "/^//s+/g/n";
break;
case "RTrim":
PtrTxa.value = "///s+$/g/n";
break;
case "Trim_M":
PtrTxa.value = "/^[^//r//n//S]+|[^//r//n//S]+$/gm/n";
break;
case "LTrim_M":
PtrTxa.value = "/^[^//r//n//S]+/gm/n";
break;
case "RTrim_M":
PtrTxa.value = "///s+$/gm/n";
break;
case "Number":
PtrTxa.value = "/([//d]+)$/gm/n$1";
break;
default:
PtrTxa.value = "//g/n";
break;
}
}
}
}
function fClearLine(Source, iProtect, bDebug)
{// shawl.qiu code : return string || void return
var bStr = false;
if(!iProtect) iProtect = 0;
if(Source.constructor==String) Source = [Source], bStr = true;
var sPtr = "[//s]*?//n";
var sFianlPtr = fRepeatString(sPtr, iProtect);
var TempAr = ["(//n", sFianlPtr, ")", "[//s]*//n"];
var TempRe = new RegExp(TempAr.join(""), "g");
Source[0] = Source[0].replace(TempRe, "$1");
if(bDebug)
{
document.write("sFianlPtr: ", sFianlPtr, "<br/>");
}
if(bStr) return Source[0];
function fRepeatString(sIpt, iLen)
{// shawl.qiu script
if(!sIpt)return "";
if(!iLen&&iLen!==0) iLen = 2;
iLen -= 0;
return new Array(iLen+1).join(sIpt);
} // end function fRepeatStr
} // end function fClearLine(Source, iProtect, bDebug)
function fListCharcode(Source)
{// shawl.qiu code : return string
var bStr = false;
if(Source.constructor==String) Source = [Source], bStr = true;
var Len = Source[0].length;
var Ar = [];
var TempAr = [];
for(var i=0; i<Len; i++)
{
var CurChar = Source[0].charAt(i);
//alert(CurChar)
Ar.push(CurChar);
TempAr.push(CurChar.charCodeAt());
if(CurChar.charCodeAt()==10||i===Len-1)
{
Ar.push(TempAr.join(","));
Ar.push("/n");
TempAr = [];
}
}
Source[0] = Ar.join("");
if(bStr) return Source[0];
} // end function fListCharcode(Source)
/*]]*/
</script>
</body>
</html>