65.9K
CodeProject 正在变化。 阅读更多。
Home

在 C# .NET 中使用正则表达式

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.40/5 (17投票s)

2010年7月16日

CPOL

4分钟阅读

viewsIcon

235891

解释了正则表达式以及使用它们的一些常见方法。

摘要

开发人员可能需要在代码中比较和搜索字符串。正则表达式是一种较旧但仍然有价值的技术,可供开发人员使用。 尽管 .NET Framework 具有内置的搜索和排序字符串的方法,但仍应理解正则表达式以确保代码开发的高效性。 在本文中,Anupam Banerji 解释了正则表达式以及使用它们的一些常见方法。

引言

较旧的计算机语言是在严重的硬件限制下编程的。 内存使用是竞争算法之间的关键因素。 内存需求最小的算法将被认为是最佳的,即使它速度较慢。 因此,PERL 开发人员创建了正则表达式来比较、搜索和修改字符串。 正则表达式是一种强大但复杂的处理大量字符串的方法。

内存使用问题已逐渐消失。 如今,内存廉价、充足,并且每几年容量几乎呈指数级增长。 算法的效率比它消耗的内存量更重要。 因此,正则表达式仍然是编写良好代码的有价值(尽管复杂)的方法。

创建正则表达式

正则表达式是处理文本的高效方法。 对于初学者来说,以下正则表达式看起来很复杂。

^\w+$ 

PERL 开发人员会微笑着。 这个正则表达式所做的只是返回与表达式比较时输入的完全相同的单词。 符号看起来很难理解,而且确实如此。 ^ 符号表示字符串的开头。 $ 表示字符串的结尾。 \w 表示整个单词,其中包含字符 A-Z、a-z、0-9 和下划线。 + 仅表示 0 次或多次重复。 正则表达式将匹配:

test
testtest
test1
1test

在 C# .NET 中使用正则表达式

System.Text.RegularExpressions 命名空间包含用于形成和评估正则表达式的Regex 类。Regex 类包含静态方法,用于将正则表达式与字符串进行比较。 Regex 类使用IsMatch() 静态方法将字符串与正则表达式进行比较。

bool match = Regex.IsMatch
(string input, string pattern);

If writing C# code, the example above would be:

if (Regex.IsMatch("testtest", @"^\w+$"))
{
     // Do something here
}

另一个有用的静态方法是Match(),它返回一个Match 对象,其中包含输入字符串中的所有匹配项。 当输入文本中存在多个匹配项时,这非常有用。 以下代码会导致多个匹配项:

string text = "first second";
string reg = @"^([\w]+) ([\w]+)$";

Match m = Regex.Match(text, reg, RegexOptions.CultureInvariant);

foreach (Group g in m.Groups)
{
    Console.WriteLine(g.Value);
}

表达式分组用括号括起来。 上面的示例返回三个组;整个文本作为第一个匹配项,第一个单词,以及第二个单词。 当需要将文本分解并分组为多个相关的文本片段以进行存储或进一步处理时,表达式分组非常有用。

快速示例

在此示例中,我们使用正则表达式来验证电子邮件地址。 我的正则表达式有效:

^((([\w]+\.[\w]+)+)|([\w]+))@(([\w]+\.)+)([A-Za-z]{1,3})$

但是,这并非用于验证电子邮件地址的唯一表达式。 我至少遇到过两种其他方法。 还有更多。

我们编写了一个小型 C# 控制台应用程序,它接受一些文本作为输入,并确定该文本是否为电子邮件地址。

using System.Text;
using System.Text.RegularExpressions;

string text = Console.ReadLine();
string reg = @"^((([\w]+\.[\w]+)+)|([\w]+))@(([\w]+\.)+)([A-Za-z]{1,3})$";

if (Regex.IsMatch(text, reg))
{
     Console.WriteLine("Email."); 
}
else
{
     Console.WriteLine("Not email."); 
}

尝试使用一些真实和虚假的电子邮件地址进行测试,看看它是否有效。 如果您发现错误,请告诉我。

文档

正则表达式的开发方式不同。 相同的任务可以通过许多不同的表达式来完成。 一个开发人员创建的表达式可能对另一个开发人员来说是不可读的。

这就是为什么记录正则表达式是开发过程中非常重要的一部分。 表达式代码注释通常跨越多行,并且值得付出努力,以防您的表达式产生意外效果,或者如果另一位开发人员接管您的代码。强制执行良好的正则表达式文档标准将确保维护问题最小化。

例如,如果我们记录上面用于验证电子邮件地址的正则表达式,我们将编写如下注释:

// Validating email addresses
//
// @"^((([\w]+\.[\w]+)+)|([\w]+))@(([\w]+\.)+)([A-Za-z]{1,3})$"
//
// The expression has three expression 
// groups.
//
// 1. ((([\w]+\.[\w]+)+)|([\w]+))
//
// The LHS of the or clause states
// that there may be more than one
// sequence of two words with a .
// between them.
//
// The RHS of the or clause states
// that there may be a single word.
//
// 2. (([\w]+\.)+)
//
// This expression states that there
// may be as many
// words separated by a . between them
// as necessary.
//
// 3. ([A-Za-z]{1,3})
//
// This expression states that the
// last set of characters may be upper
// or lowercase letters. There must be
// a minimum of 1 and a maximum of 3.

对于许多开发标准来说,这可能被认为是一长串注释,但表达式已被分解为表达式组。 新的开发人员几乎没有困难就能理解编写表达式的函数和动机。 应该始终如一地执行此实践,以避免在升级或调试软件时出现问题。

有用的 Regex 软件

如果您在 *NIX 中使用过 shell 脚本,那么您就使用过grep Windows 有 PowerGrep 工具,它与grep 类似。 PowerShell 是另一个基于 .NET 正则表达式引擎的工具,并且具有命令行脚本实用程序。 Espresso by UltraPico (www.ultrapico.com) 是一个免费的正则表达式编辑器,您可以使用它来构建和测试您的正则表达式。

结论

正则表达式是搜索、识别和验证大量文本的高效方法,而无需编写任何比较。 尽管它们可能很复杂,但编写和记录正则表达式可以使开发人员专注于实现过程中更重要的部分。 使用几个免费和开源的正则表达式工具使得理解和构建正则表达式成为一项有价值的任务。

要下载此技术文章的 PDF 格式,请访问 Coactum Solutions 网站:http://www.coactumsolutions.com/Articles.aspx

© . All rights reserved.