
不多说废话了,直接贴一些重要的代码:
(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="";
}
[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="";
}
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;
}
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;
}
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();
}
}
}
自动构建正则表达式我也见识过一个这样的工具,不过我对其实现机制还是不大理解,慢慢再说吧,就写这里了,太累了,。。。
本文介绍了一个正则表达式工具的关键代码实现,包括查找匹配项、替换匹配项的功能,并展示了如何通过树形结构展示匹配结果,同时提供了保存和读取项目设置的方法。
125

被折叠的 条评论
为什么被折叠?



