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

简介:

        
        最初接触到正则表达式是在大一时准备高程考试的时候,那时候只知道这个东西可以拿来对对给定的语句进行匹配,可对它很多的东西都不了解。在学习了C#后,终于有机会接触到这方面的细节了,其实我用过的方面也不多,回想起来也就有几个地方用过:比如用户注册时判断email地址是否合法,手机号码,身份证号码是否符合格式,用户名和密码的限制等,再有就是在做一些文本的搜索与替换,当然字符串处理的很多方面都会用到。

       正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法使您可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合以生成报告。对于处理字符串(例如 HTML 处理、日志文件分析和 HTTP 标头分析)的许多应用程序而言,正则表达式是不可缺少的工具。

       我们可能比较熟悉在 DOS 文件系统中使用的 ? 和 * 元字符,这两个元字符分别代表任意单个字符和字符组。DOS 文件命令 COPY *.DOC A: 命令文件系统将文件扩展名为 .DOC 的所有文件均复制到 A 驱动器的磁盘中。元字符 * 代表文件扩展名 .DOC 前的任何文件名。

       以下简单介绍下 .NET Framework 中用到的正则表达式类。

Regex

Regex 类表示不可变(只读)正则表达式类。它还包含各种静态方法,允许在不显式创建其他类的实例的情况下使用其他正则表达式类。

以下代码示例创建了 Regex 类的实例并在初始化对象时定义一个简单的正则表达式。请注意,使用了附加的反斜杠作为转义字符,它将 \s 匹配字符类中的反斜杠指定为原义字符。


// Declare object variable of type Regex.

    Regex r; 

    // Create a Regex object and define its regular expression.

    r = new Regex("\\s2000");


    Match

Match 类表示正则表达式匹配操作的结果。以下示例使用 Regex 类的 Match 方法返回 Match 类型的对象,以便找到输入字符串中的第一个匹配项。此示例使用 Match 类的 Match.Success 属性来指示是否已找到匹配。

   

// Create a new Regex object.

    Regex r = new Regex("abc"); 

    // Find a single match in the string.

    Match m = r.Match("123abc456"); 

    if (m.Success) 

    {

        // Print out the character position where a match was found. 

        // (Character position 3 in this case.)

        Console.WriteLine("Found match at position " + m.Index);

    }


MatchCollection

MatchCollection 类表示成功的非重叠匹配的序列。该集合为不可变(只读)的,并且没有公共构造函数。MatchCollection 的实例是由 Regex.Matches 属性返回的。

以下示例使用 Regex 类的 Matches 方法,通过在输入字符串中找到的所有匹配填充 MatchCollection。该示例将此集合复制到一个字符串数组和一个整数数组中,其中字符串数组用以保存每个匹配项,整数数组用以指示每个匹配项的位置。

   

MatchCollection mc;

    String[] results = new String[20];

    int[] matchposition = new int[20];

    

    // Create a new Regex object and define the regular expression.

    Regex r = new Regex("abc"); 

    // Use the Matches method to find all matches in the input string.

    mc = r.Matches("123abc4abcd");

    // Loop through the match collection to retrieve all 

    // matches and positions.

    for (int i = 0; i < mc.Count; i++) 

    {

        // Add the match string to the string array.   

        results[i] = mc[i].Value;

        // Record the character position where the match was found.

        matchposition[i] = mc[i].Index;   

    }


GroupCollection

GroupCollection 类表示捕获的组的集合并返回单个匹配中捕获的组的集合。该集合为不可变(只读)的,并且没有公共构造函数。GroupCollection 的实例在 Match.Groups 属性返回的集合中返回。

以下控制台应用程序示例查找并输出由正则表达式捕获的组的数目。有关如何提取组集合的每一成员中的各个捕获项的示例,请参见下面一节的 Capture Collection 示例。

  

  using System;

    using System.Text.RegularExpressions;

 

    public class RegexTest 

    {

        public static void RunTest() 

        {

            // Define groups "abc", "ab", and "b".

            Regex r = new Regex("(a(b))c"); 

            Match m = r.Match("abdabc");

            Console.WriteLine("Number of groups found = " + m.Groups.Count);

        }

        public static void Main() 

        {

            RunTest();

        }

    }

该示例产生下面的输出。

   

Number of groups found = 3

CaptureCollection

CaptureCollection 类表示捕获的子字符串的序列,并且返回由单个捕获组执行的捕获的集合。由于限定符,捕获组可以在单个匹配中捕获多个字符串。Captures 属性(CaptureCollection 类的对象)是作为 Match 和 group 类的成员提供的,以便于对捕获的子字符串的集合的访问。

例如,如果使用正则表达式 ((a(b))c)+(其中 + 限定符指定一个或多个匹配)从字符串“abcabcabc”中捕获匹配,则子字符串的每一匹配的 Group 的 CaptureCollection 将包含三个成员。

以下控制台应用程序示例使用正则表达式 (Abc)+ 来查找字符串“XYZAbcAbcAbcXYZAbcAb”中的一个或多个匹配。该示例阐释了使用 Captures 属性来返回多组捕获的子字符串。

   

using System;

    using System.Text.RegularExpressions;

 

    public class RegexTest 

        {

        public static void RunTest() 

        {

            int counter;

            Match m;

            CaptureCollection cc;

            GroupCollection gc;

 

            // Look for groupings of "Abc".

            Regex r = new Regex("(Abc)+"); 

            // Define the string to search.

            m = r.Match("XYZAbcAbcAbcXYZAbcAb"); 

            gc = m.Groups;

 

            // Print the number of groups.

            Console.WriteLine("Captured groups = " + gc.Count.ToString());

 

            // Loop through each group.

            for (int i=0; i < gc.Count; i++) 

            {

                cc = gc[i].Captures;

                counter = cc.Count;

                

                // Print number of captures in this group.

                Console.WriteLine("Captures count = " + counter.ToString());

                

                // Loop through each capture in group.

                for (int ii = 0; ii < counter; ii++) 

                {

                    // Print capture and position.

                    Console.WriteLine(cc[ii] + "   Starts at character " + 

                        cc[ii].Index);

                }

            }

        }

 

        public static void Main() {

            RunTest();

        }

    }


此示例返回下面的输出结果。

   

 Captured groups = 2

    Captures count = 1

    AbcAbcAbc   Starts at character 3

    Captures count = 3

    Abc   Starts at character 3

    Abc   Starts at character 6

    Abc   Starts at character 9


Group

group 类表示来自单个捕获组的结果。因为 Group 可以在单个匹配中捕获零个、一个或更多的字符串(使用限定符),所以它包含 Capture 对象的集合。因为 Group 继承自 Capture,所以可以直接访问最后捕获的子字符串(Group 实例本身等价于 Captures 属性返回的集合的最后一项)。

Group 的实例是由 Match.Groups(groupnum) 属性返回的,或者在使用“(?<groupname>)”分组构造的情况下,是由 Match.Groups("groupname") 属性返回的。

以下代码示例使用嵌套的分组构造来将子字符串捕获到组中。

   

 int[] matchposition = new int[20];

    String[] results = new String[20];

    // Define substrings abc, ab, b.

    Regex r = new Regex("(a(b))c"); 

    Match m = r.Match("abdabc");

    for (int i = 0; m.Groups[i].Value != ""; i++) 

    {

        // Copy groups to string array.

        results[i]=m.Groups[i].Value; 

        // Record character position.

        matchposition[i] = m.Groups[i].Index; 

    }


此示例返回下面的输出结果。

   

 results[0] = "abc"   matchposition[0] = 3

    results[1] = "ab"    matchposition[1] = 3

    results[2] = "b"     matchposition[2] = 4


以下代码示例使用命名的分组构造,从包含“DATANAME:VALUE”格式的数据的字符串中捕获子字符串,正则表达式通过冒号“:”拆分数据。

  

  Regex r = new Regex("^(?<name>\\w+):(?<value>\\w+)");

    Match m = r.Match("Section1:119900");


此正则表达式返回下面的输出结果。

   

 m.Groups["name"].Value = "Section1"

    m.Groups["value"].Value = "119900"


Capture

Capture 类包含来自单个子表达式捕获的结果。

以下示例在 Group 集合中循环,从 Group 的每一成员中提取 Capture 集合,并且将变量 posn 和 length 分别分配给找到每一字符串的初始字符串中的字符位置,以及每一字符串的长度。

   

Regex r;

    Match m;

    CaptureCollection cc;

    int posn, length;

 

    r = new Regex("(abc)*");

    m = r.Match("bcabcabc");

    for (int i=0; m.Groups[i].Value != ""; i++) 

    {

        // Capture the Collection for Group(i).

        cc = m.Groups[i].Captures; 

        for (int j = 0; j < cc.Count; j++) 

        {

            // Position of Capture object.

            posn = cc[j].Index; 

            // Length of Capture object.

            length = cc[j].Length; 

        }

}


在以前编程中用到正则表达式时,总是需要在代码中来对构造出的正则表达式进行测试,不断重复进行着构造—测试---修改---测试的麻烦工作,而项目文件过大时编译一次真不是件舒服的事情,我就想到自己做一个小工具用来构造和测试正则表达式,并且产生相应的代码,这样就可以直接用到项目中来了,从而避免这些烦人的工作了。因此我目标分为如下两部分:1)对构造的正则表达式进行测试,如果测试成功就产生相应的代码。2)通过一些GUI来自动构造正则表达式子(当然这部分我还不大熟)。



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/07/31/464315.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
一些适合性能测试脚本编写和维护的工具
一些适合性能测试脚本编写和维护的工具
|
10天前
|
监控 JavaScript 测试技术
postman接口测试工具详解
Postman是一个功能强大且易于使用的API测试工具。通过详细的介绍和实际示例,本文展示了Postman在API测试中的各种应用。无论是简单的请求发送,还是复杂的自动化测试和持续集成,Postman都提供了丰富的功能来满足用户的需求。希望本文能帮助您更好地理解和使用Postman,提高API测试的效率和质量。
54 11
|
1月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
65 3
|
2月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
80 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)