
不多说废话了,直接贴一些重要的代码:
(1)查找匹配项:
privatevoidRunMatch()


{
Regexr;
Matchm;

statusBar.Panels[0].Text="";
statusBar.Panels[1].Text="";
statusBar.Panels[2].Text="";

InputBox.Select(0,0);//Unselectallthetext
Dirty=false;
Skip=true;

this.Cursor=Cursors.WaitCursor;
if((r=MakeRegex())==null)


{
this.Cursor=Cursors.Default;
return;
}

Tree.Nodes.Clear();
ResultsBox.Text="";
ShowBuilder(false);
ShowTree(true);
this.Cursor=Cursors.Default;

//Storetheresultsinthetextbox
for(m=r.Match(InputBox.Text);m.Success;m=m.NextMatch())


{
if(m.Value.Length>0)


{
Tree.Nodes.Add("["+m.Value+"]");
intThisNode=Tree.Nodes.Count-1;
Tree.Nodes[ThisNode].Tag=m;
if(m.Groups.Count>1)


{
for(inti=1;i<m.Groups.Count;i++)


{
Tree.Nodes[ThisNode].Nodes.Add(r.GroupNameFromNumber(i)+":["+m.Groups[i].Value+"]");
Tree.Nodes[ThisNode].Nodes[i-1].Tag=m.Groups[i];
//Thisbitofcodeputsinanotherlevelofnodesshowingthecapturesforeachgroup
intNumber=m.Groups[i].Captures.Count;
if(Number>1)
for(intj=0;j<Number;j++)


{
Tree.Nodes[ThisNode].Nodes[i-1].Nodes.Add(m.Groups[i].Captures[j].Value);
Tree.Nodes[ThisNode].Nodes[i-1].Nodes[j].Tag=m.Groups[i].Captures[j];
}
}
}
}
}
statusBar.Panels[0].Text=Tree.Nodes.Count.ToString()+"Matches";
Skip=false;
}
(2)替换匹配项
privatevoidRunReplace()


{
Regexr;
this.Cursor=Cursors.WaitCursor;
statusBar.Panels[0].Text="";
statusBar.Panels[1].Text="";
statusBar.Panels[2].Text="";

InputBox.Select(0,0);//Unselectallthetext
Dirty=false;
Skip=true;

if((r=MakeRegex())==null)


{
this.Cursor=Cursors.Default;
return;
}

Tree.Nodes.Clear();
ShowBuilder(false);
ShowTree(false);
this.Cursor=Cursors.Default;
ResultsBox.Text=r.Replace(InputBox.Text,Replace.Text);
Skip=false;
statusBar.Panels[0].Text="";
}
(3)保存项目信息的两个类
[Serializable]
publicclassSettings


{
publicstringFileName="TheRegexAssembly.dll";
publicstringClassName="TheRegexClass";
publicstringNamespace="TheRegex";
publicboolIsPublic=true;
publicstringInputData="";
publicstringRegularExpression="";
publicstringReplacementString="";
publicboolIgnoreCase=true;
publicboolMultiline=true;
publicboolSingleline=false;
publicboolExplicitCapture=false;
publicboolECMAScript=false;
publicboolRightToLeft=false;
publicboolIgnorePatternWS=true;
publicboolCompiled=true;
publicintLeftPanelWidth=470;
publicintTreeHeight=150;
publicSizeSize=newSize(800,400);
}

publicclassRegistrySettings


{
publicstring[]MRUList=newstring[0];
publicPointLocation=newPoint(100,100);
publicstringProjectFile="";
publicstringOpenPathName="";
publicstringSavePathName="";
}
(4)保存项目
privateboolSaveFileData()


{
settings.InputData=InputBox.Text;
settings.IsPublic=MakeForm.IsPublic;
settings.Namespace=MakeForm.Namespace;
settings.ClassName=MakeForm.ClassName;
settings.InputData=InputBox.Text;
settings.ReplacementString=Replace.Text;
settings.RegularExpression=RegexBox.Text;
settings.IgnoreCase=IgnoreCase.Checked;
settings.Multiline=Multiline.Checked;
settings.Singleline=Singleline.Checked;
settings.ExplicitCapture=Explicit.Checked;
settings.ECMAScript=ECMA.Checked;
settings.RightToLeft=RightToLeftBox.Checked;
settings.IgnorePatternWS=IgnorePattern.Checked;
settings.Compiled=Compiled.Checked;
settings.LeftPanelWidth=LeftPanel.Width;
if(IsVisible)settings.TreeHeight=Tree.Height;
elsesettings.TreeHeight=SaveTreeHeight;
settings.Size=this.Size;
if(Savior.SaveToFile(settings,ProjectFileName))returntrue;
elsereturnfalse;
}
(5)从设置文件中读取信息
privateboolReadFileData()


{
settings=(Settings)Savior.ReadFromFile(settings,ProjectFileName);
if(settings==null)returnfalse;
InputBox.Text=settings.InputData;
Replace.Text=settings.ReplacementString;
RegexBox.Text=settings.RegularExpression;
MakeForm.FileName=settings.FileName;
MakeForm.IsPublic=settings.IsPublic;
MakeForm.Namespace=settings.Namespace;
MakeForm.ClassName=settings.ClassName;
IgnoreCase.Checked=settings.IgnoreCase;
Multiline.Checked=settings.Multiline;
Singleline.Checked=settings.Singleline;
Explicit.Checked=settings.ExplicitCapture;
ECMA.Checked=settings.ECMAScript;
RightToLeftBox.Checked=settings.RightToLeft;
IgnorePattern.Checked=settings.IgnorePatternWS;
Compiled.Checked=settings.Compiled;
LeftPanel.Width=settings.LeftPanelWidth;
Tree.Height=settings.TreeHeight;
SaveTreeHeight=Tree.Height;
this.Size=settings.Size;
returntrue;
}
(6)树结点选择
privatevoidTree_AfterSelect(objectsender,System.Windows.Forms.TreeViewEventArgse)


{
if(Skip)return;
if(Tree.SelectedNode.Parent==null)//Mustbethetoplevelnode


{
Matchm=(Match)Tree.SelectedNode.Tag;
ResultsBox.Text=m.Value;
statusBar.Panels[1].Text="Position:"+m.Index;
statusBar.Panels[2].Text="Length:"+m.Length;
if(m!=null&&!Dirty)


{
InputBox.Select(m.Index,m.Length);
InputBox.ScrollToCaret();
}
}
elseif(Tree.SelectedNode.Parent.Parent==null)//Mustbeagroup


{
Groupg=(Group)Tree.SelectedNode.Tag;
ResultsBox.Text=g.Value;
statusBar.Panels[1].Text="Position:"+g.Index;
statusBar.Panels[2].Text="Length:"+g.Length;
if(g!=null&&!Dirty)


{
InputBox.Select(g.Index,g.Length);
InputBox.ScrollToCaret();
}
}
else//Mustbeacapture


{
Capturec=(Capture)Tree.SelectedNode.Tag;
ResultsBox.Text=c.Value;
statusBar.Panels[1].Text="Position:"+c.Index;
statusBar.Panels[2].Text="Length:"+c.Length;
if(c!=null&&!Dirty)


{
InputBox.Select(c.Index,c.Length);
InputBox.ScrollToCaret();
}
}
}
自动构建正则表达式我也见识过一个这样的工具,不过我对其实现机制还是不大理解,慢慢再说吧,就写这里了,太累了,。。。