正则表达式构造与测试小工具(下)

简介:



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

        private void RunMatch()
        {
            Regex r;
            Match m;

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

            InputBox.Select(0,0);   // Unselect all the text
            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;

            // Store the results in the text box
            for (m = r.Match(InputBox.Text); m.Success; m = m.NextMatch()) 
            {
                if(m.Value.Length>0)
                {
                    Tree.Nodes.Add("["+m.Value + "]");
                    int ThisNode=Tree.Nodes.Count-1;
                    Tree.Nodes[ThisNode].Tag=m;
                    if(m.Groups.Count>1)
                    {
                        for (int i=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];
              //This bit of code puts in another level of nodes showing the captures for each group
                            int Number=m.Groups[i].Captures.Count;
                            if(Number>1)
                                for(int j=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)替换匹配项
        private void RunReplace()
        {
            Regex r;
            this.Cursor=Cursors.WaitCursor;
            statusBar.Panels[0].Text="";
            statusBar.Panels[1].Text="";
            statusBar.Panels[2].Text="";

            InputBox.Select(0,0);   // Unselect all the text
            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]
    public class Settings
    {
        public string FileName="TheRegexAssembly.dll";
        public string ClassName="TheRegexClass";
        public string Namespace="TheRegex";
        public bool IsPublic=true;
        public string InputData= "";
        public string RegularExpression = "";
        public string ReplacementString = "";
        public bool IgnoreCase = true;
        public bool Multiline = true;
        public bool Singleline = false;
        public bool ExplicitCapture = false;
        public bool ECMAScript = false;
        public bool RightToLeft = false;
        public bool IgnorePatternWS = true;
        public bool Compiled = true;
        public int LeftPanelWidth = 470;
        public int TreeHeight = 150;
        public Size Size = new Size(800, 400);
    }

    public class RegistrySettings
    {
        public string[] MRUList = new string[0];
        public Point Location = new Point(100,100);
        public string ProjectFile ="";
        public string OpenPathName="";
        public string SavePathName="";
    }
(4)保存项目
    private bool SaveFileData()
        {
            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;
            else settings.TreeHeight=SaveTreeHeight;
            settings.Size=this.Size;
            if(Savior.SaveToFile(settings, ProjectFileName))return true;
            else return false;
        }

(5)从设置文件中读取信息
        private bool ReadFileData()
        {
            settings = (Settings)Savior.ReadFromFile(settings,ProjectFileName);
            if(settings==null)return false;
            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;
            return true;
        }
(6)树结点选择
private void Tree_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
        {
            if(Skip)return;
            if(Tree.SelectedNode.Parent==null) // Must be the top level node
            {
                Match m=(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();
                }
            }
            else if(Tree.SelectedNode.Parent.Parent==null) // Must be a group
            {
                Group g=(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 // Must be a capture
            {
                Capture c=(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();
                }
            }
        }

自动构建正则表达式我也见识过一个这样的工具,不过我对其实现机制还是不大理解,慢慢再说吧,就写这里了,太累了,。。。



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/08/01/465331.html,如需转载请自行联系原作者
目录
相关文章
|
26天前
|
Java 测试技术 数据安全/隐私保护
软件测试中的自动化策略与工具应用
在软件开发的快速迭代中,自动化测试以其高效、稳定的特点成为了质量保证的重要手段。本文将深入探讨自动化测试的核心概念、常见工具的应用,以及如何设计有效的自动化测试策略,旨在为读者提供一套完整的自动化测试解决方案,帮助团队提升测试效率和软件质量。
|
19天前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
122 17
Selenium:强大的 Web 自动化测试工具
|
29天前
|
机器学习/深度学习 人工智能 算法
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
BALROG 是一款用于评估大型语言模型(LLMs)和视觉语言模型(VLMs)在复杂动态环境中推理能力的基准测试工具。它通过一系列挑战性的游戏环境,如 NetHack,测试模型的规划、空间推理和探索能力。BALROG 提供了一个开放且细粒度的评估框架,推动了自主代理研究的进展。
42 3
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
|
1月前
|
监控 测试技术 开发工具
移动端性能测试工具
移动端性能测试工具
51 2
|
1月前
|
安全 前端开发 测试技术
如何选择合适的自动化安全测试工具
选择合适的自动化安全测试工具需考虑多个因素,包括项目需求、测试目标、系统类型和技术栈,工具的功能特性、市场评价、成本和许可,以及集成性、误报率、社区支持、易用性和安全性。综合评估这些因素,可确保所选工具满足项目需求和团队能力。
|
1月前
|
安全 网络协议 关系型数据库
最好用的17个渗透测试工具
渗透测试是安全人员为防止恶意黑客利用系统漏洞而进行的操作。本文介绍了17款业内常用的渗透测试工具,涵盖网络发现、无线评估、Web应用测试、SQL注入等多个领域,包括Nmap、Aircrack-ng、Burp Suite、OWASP ZAP等,既有免费开源工具,也有付费专业软件,适用于不同需求的安全专家。
193 2
|
1月前
|
监控 网络协议 Java
一些适合性能测试脚本编写和维护的工具
一些适合性能测试脚本编写和维护的工具
|
6月前
|
数据库 Python
Python网络数据抓取(8):正则表达式
Python网络数据抓取(8):正则表达式
66 2
|
6月前
|
自然语言处理 JavaScript 前端开发
Python高级语法与正则表达式(二)
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
|
6月前
|
安全 算法 Python
Python高级语法与正则表达式(一)
Python提供了 with 语句的写法,既简单又安全。 文件操作的时候使用with语句可以自动调用关闭文件操作,即使出现异常也会自动关闭文件操作。