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

简介:

        
        最初接触到正则表达式是在大一时准备高程考试的时候,那时候只知道这个东西可以拿来对对给定的语句进行匹配,可对它很多的东西都不了解。在学习了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,如需转载请自行联系原作者
目录
相关文章
|
6天前
|
机器人 测试技术 持续交付
现代软件测试中的自动化工具与策略
随着软件开发的快速发展,自动化测试成为提高软件质量和加快发布速度的关键。本文探讨了现代软件测试中自动化工具和策略的重要性及其应用,旨在帮助开发团队更有效地实施自动化测试,提升整体开发效率和产品质量。
|
5天前
|
jenkins 测试技术 持续交付
软件测试的自动化:工具与策略的探索
【6月更文挑战第20天】探索软件测试自动化:强调效率、一致性与持续集成。Selenium、Appium、Postman和Jenkins等工具助力自动化测试,策略包括明确测试目标、选对工具、编写优质用例和持续集成。自动化测试优化软件质量,提升团队能力,适应快速发展的行业需求。
|
6天前
|
监控 前端开发 测试技术
postman接口测试工具详解
postman接口测试工具详解
34 7
|
7天前
|
监控 JavaScript 前端开发
postman接口测试工具详解
postman接口测试工具详解
20 6
|
5天前
|
机器学习/深度学习 人工智能 机器人
现代软件测试中的自动化工具与技术
随着软件开发复杂性的增加,自动化测试在现代软件开发中变得至关重要。本文探讨了当前流行的自动化测试工具和技术,以及它们如何提高软件质量、加快发布速度和降低成本。
18 1
|
4天前
|
Java 测试技术 C#
几个好用的自动化测试工具总结
【6月更文挑战第4天】几个好用的自动化测试工具总结
21 0
|
11天前
|
机器学习/深度学习 人工智能 jenkins
探索自动化测试工具的选择与应用
在软件开发生命周期中,软件测试是确保质量的重要环节。随着自动化技术的发展,自动化测试工具的选择和应用变得至关重要。这篇文章将深入探讨如何选择适合的自动化测试工具,并结合实例分析其实际应用效果,从而为开发团队提供有效的指导。
|
1月前
|
Python
Python 内置正则表达式库re的使用
正则表达式是记录文本规则的代码,用于查找和处理符合特定规则的字符串。在Python中,常通过原生字符串`r&#39;string&#39;`表示。使用`re.compile()`创建正则对象,便于多次使用。匹配字符串有`match()`(从开头匹配)、`search()`(搜索首个匹配)和`findall()`(找所有匹配)。替换字符串用`sub()`,分割字符串则用`split()`。
40 3
|
21天前
|
数据库 Python
Python网络数据抓取(8):正则表达式
Python网络数据抓取(8):正则表达式
16 2
|
4天前
|
自然语言处理 JavaScript 前端开发
Python高级语法与正则表达式(二)
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

热门文章

最新文章