`
water84222
  • 浏览: 375391 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

C#中利用正则表达式实现字符串搜索

阅读更多

C#中利用正则表达式实现字符串搜索

作者来源: 
阅读 354 人次 , 2006-4-27 9:52:00 
 

摘要:本文给出了在C#下利用正则表达式实现字符串搜索功能的方法,通过对.NET框架下的正则表达式的研究及实例分析,总结了正则表达式的元字符、规则、选项等。

  关键字:正则表达式、元字符、字符串、匹配

  1、正则表达式简介

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

  .NET 框架正则表达式并入了其他正则表达式实现的最常见功能,被设计为与 Perl 5 正则表达式兼容,.NET 框架正则表达式还包括一些在其他实现中尚未提供的功能,.NET 框架正则表达式类是基类库的一部分,并且可以和面向公共语言运行库的任何语言或工具一起使用。

  2、字符串搜索

  正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。正是元字符组为正则表达式提供了处理能力。当前,所有的文本编辑器都有一些搜索功能,通常可以打开一个对话框,在其中的一个文本框中键入要定位的字符串,如果还要同时进行替换操作,可以键入一个替换字符串,比如在Windows操作系统中的记事本、Office系列中的文档编辑器都有这种功能。这种搜索最简单的方式,这类问题很容易用String类的String.Replace()方法来解决,但如果需要在文档中识别某个重复的,该怎么办?编写一个例程,从一个String类中选择重复的字是比较复杂的,此时使用语言就很适合。

  一般表达式语言是一种可以编写搜索表达式的语言。在该语言中,可以把文档中要搜索的文本、转义序列和特定含义的其他字符组合在一起,例如序列\b表示一个字的开头和结尾(子的边界),如果要表示正在查找的以字符th开头的字,就可以编写一般表达式\bth(即序列字符界是-t-h)。如果要搜索所有以th结尾的字,就可以编写th\b(序列t-h-字边界)。但是,一般表达式要比这复杂得多,例如,可以在搜索操作中找到存储部分文本的工具性程序(facility)。

  3、.NET 框架的正则表达式类

  下面通过介绍 .NET 框架的正则表达式类,熟悉一下.NET框架下的正则表达式的使用方法。

  3.1 Regex 类表示只读正则表达式

  Regex 类包含各种静态方法,允许在不显式实例化其他类的对象的情况下使用其他正则表达式类。以下代码示例创建了 Regex 类的实例并在初始化对象时定义一个简单的正则表达式。请注意,使用了附加的反斜杠作为转义字符,它将 \s 匹配字符类中的反斜杠指定为原义字符。

Regex r; // 声明一个 Regex类的变量
r = new Regex("\\s2000"); // 定义表达式

  3.2 Match 类表示正则表达式匹配操作的结果

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

Regex r = new Regex("abc"); // 定义一个Regex对象实例
Match m = r.Match("123abc456"); // 在字符串中匹配
if (m.Success)
{
 Console.WriteLine("Found match at position " + m.Index); //输入匹配字符的位置
}

  3.3 MatchCollection 类表示非重叠匹配的序列

  该集合为只读的,并且没有公共构造函数。MatchCollection 的实例是由 Regex.Matches 属性返回的。使用 Regex 类的 Matches 方法,通过在输入字符串中找到的所有匹配填充 MatchCollection。下面代码示例演示了如何将集合复制到一个字符串数组(保留每一匹配)和一个整数数组(指示每一匹配的位置)中。

MatchCollection mc;
String[] results = new String[20];
int[] matchposition = new int[20];
Regex r = new Regex("abc"); //定义一个Regex对象实例
mc = r.Matches("123abc4abcd");
for (int i = 0; i < mc.Count; i++) //在输入字符串中找到所有匹配
{
 results[i] = mc[i].Value; //将匹配的字符串添在字符串数组中
 matchposition[i] = mc[i].Index; //记录匹配字符的位置
}

  3.4 GroupCollection 类表示捕获的组的集合

  该集合为只读的,并且没有公共构造函数。GroupCollection 的实例在 Match.Groups 属性返回的集合中返回。下面的控制台应用程序查找并输出由正则表达式捕获的组的数目。

using System;
using System.Text.RegularExpressions;
public class RegexTest
{
 public static void RunTest()
 {
  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

  3.5 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;
  Regex r = new Regex("(Abc)+"); //查找"Abc"
  m = r.Match("XYZAbcAbcAbcXYZAbcAb"); //设定要查找的字符串
  gc = m.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;
   Console.WriteLine("Captures count = " + counter.ToString());
   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

  3.6 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++)
{
 cc = m.Groups[i].Captures;
 for (int j = 0; j < cc.Count; j++)
 {
  posn = cc[j].Index; //捕获对象位置
  length = cc[j].Length; //捕获对象长度
 }
}

C#中利用正则表达式实现字符串搜索(图一)
图1:对象关系

  把组合字符组合起来后,每次都会返回一个组对象,就可能并不是我们希望的结果。如果希望把组合字符作为搜索模式的一部分,就会有相当大的系统开销。对于单个的组,可以用以字符序列"?:"开头的组禁止这么做,就像URI样例那样。而对于所有的组,可以在RegEx.Matches()方法上指定RegExOptions.ExplicitCapture标志。
 
分享到:
评论

相关推荐

    C#正则表达式大全, 判断字符串是否为正整数,中文,英文.....

    正则表达式是指用来描述字符串模式的表达式,通过使用正则表达式,我们可以轻松地实现字符串的匹配、验证、提取和替换等操作。在 C# 中,我们可以使用 System.Text.RegularExpressions 命名空间中的 Regex 类来实现...

    使用正则表达式拆分字符串

    下面将详细阐述正则表达式的概念、语法以及如何在不同编程语言中实现字符串的拆分。 1. 正则表达式基础 - **模式匹配**:正则表达式由一系列字符和特殊符号组成,用于定义一个模式,该模式可以匹配特定的字符串。 ...

    c#正则表达式截取指定字符串之间的字符串。类文件直接用就可以了~

    给写了2个方法,一个是直接截取单个需要的字符串,比如字符串string a="ab123456",我只需要提取3,那么就是单独截取就可以了,从2开始到4结束就行。 第二个是把所有的符合条件的字符串都截取出来,提取出来,比如...

    C#字符串和正则表达式参考手册

    在实际开发中,结合`StringBuilder`类处理大量字符串拼接,以及利用正则表达式的强大功能进行数据验证和清洗,都将使你的代码更加高效和专业。通过深入阅读《C#字符串和正则表达式参考手册》,你将能够更全面地理解...

    C#.net 使用正则表达式拆分字符串

    在C#.NET编程中,正则表达式是一个强大的工具,用于处理字符串的匹配、查找、替换和拆分等任务。正则表达式是由特殊字符和普通字符组成的模式,用于匹配文本字符串。本教程将深入探讨如何使用C#.NET中的正则表达式...

    C下利用正则表达式实现字符串搜索功能方法.pdf

    在C#编程中,利用正则表达式实现字符串搜索功能是一项强大的技术。正则表达式,简称regex,是一种模式匹配工具,能够有效地处理文本,包括查找、替换、提取和验证字符串中的特定模式。本文主要围绕C#中正则表达式的...

    正则表达式测试工具C#版(src)

    正则表达式是一种强大的文本处理工具,用于在字符串中进行模式匹配和搜索。在C#编程语言中,正则表达式被广泛应用于数据验证、文本提取、格式转换等多个场景。本项目提供了一个C#编写的正则表达式测试工具,包含完整...

    C#中利用正则表达式实现

     .NET 框架正则表达式并入了其他正则表达式实现的最常见功能,被设计为与 Perl 5 正则表达式兼容,.NET 框架正则表达式还包括一些在其他实现中尚未提供的功能,.NET 框架正则表达式类是基类库的一部分,并且可以和...

    在C#中利用正则表达式判断用户输入是否是数字

    在C#中利用正则表达式判断用户输入是否是数字 在C#中,判断用户输入是否是数字是一个非常常见的问题。通常,我们可以使用TryParse方法来判断输入是否是数字,但是这种方法有其局限性。例如,TryParse方法无法判断...

    C#中的正则表达式是如何使用的

    正则表达式是C#中处理字符串的强大工具。通过Regex类,可以轻松地在C#应用程序中实现复杂的文本匹配和处理功能。掌握正则表达式的语法和使用方法,对于提高编程效率和处理文本数据的能力至关重要。 在C#中,正则...

    SQL 语法分析,正则表达式解析C#文件;正则表达式实现的语法分析引擎

    实现一个正则表达式解析引擎需要理解正则表达式的语法和行为,以及如何在C#中使用这些概念。引擎通常会包含一个解析方法,该方法接受一个字符串输入,使用正则表达式进行匹配,并返回匹配的结果。同时,可能还需要...

    C#中利用正则表达式实现搜索 .doc

    ### C#中利用正则表达式实现搜索 #### 一、正则表达式概述 正则表达式(Regular Expression)是一种强大的文本处理工具,能够帮助开发者执行一系列复杂的文本处理任务,如查找、替换、提取等。它在多种编程语言...

    C#字符串和正则表达式参考手册.rar

    字符串处理和正则表达式是C#编程中的两个重要概念,它们在数据处理、输入验证和文本搜索等方面起着至关重要的作用。 **C#字符串** 在C#中,字符串是不可变的对象,这意味着一旦创建了字符串,就不能改变它的内容。...

    C#字符串和正则表达式参考手册.pdf

    《C#字符串和正则表达式参考手册》是一本专注于C#编程语言中字符串操作和正则表达式的使用指南。本书涵盖了.NET Framework处理文本的方式、String类和StringBuilder类的使用,以及如何在.NET环境中构建和操作字符串...

    C#中 用正则表达式

    - 这行代码创建了一个新的`Regex`对象,并传递了一个正则表达式字符串`"^[0-9]{1,}$"`。 - 正则表达式解释如下: - `^` 表示字符串的开始。 - `[0-9]` 匹配任何单个数字字符。 - `{1,}` 表示前面的模式至少出现...

    C#中的正则表达式详解

    #### 二、字符串搜索 正则表达式由两种基本字符类型组成:普通文本字符和元字符。普通文本字符就是我们常见的字母数字字符,而元字符则是具有特殊意义的字符,用于构建更复杂的模式匹配逻辑。 在实际应用中,很多...

    C#中使用正则表达式详解.pdf

    通过学习如何声明逐字字符串、掌握基本的语法字符及定位字符,结合实战案例,开发者可以在实际项目中更加灵活地利用正则表达式完成各种文本处理任务。正则表达式的强大功能使其成为处理文本数据的重要工具之一,熟练...

    C#正则表达式集合C# 正则表达式 集合C# 正则表达式 集合C# 正则表达式 集合

    通过以上对C#正则表达式集合的详细解释,我们可以看到正则表达式在实际开发中的强大功能,无论是数据验证还是文本处理等方面都能发挥重要作用。开发者可以根据具体需求灵活地应用这些正则表达式,提高程序的健壮性和...

    C#中使用正则表达式详解

    在 C# 中,正则表达式类位于 System.Text.RegularExpressions 命名空间中,它们具有用来检查给出的字符串是否符合规则的属性和方法。 基本语法字符 在正则表达式中,有一些基本语法字符,它们具有特殊的含义: * ...

Global site tag (gtag.js) - Google Analytics