详解C#正规表达式

来源:互联网 发布:复杂网络算法研究 编辑:程序博客网 时间:2024/05/01 04:39

C#正规表达式允许快速有效地处理文本。被处理的文本小到一个电子邮件地址,大到一个多行的输入框内容。C#正规表达式的使用不仅允许你使用一个定义模式来校验文本,而且还允许你从匹配一个给定模式的文本中提取数据。

你可以把一个正规表达式当作是一种特别强有力的通配符。当我们看到象"SAMS*"这样的表达式时,我们都会熟悉通配符,任何以单词SAMS开头的内容都是一个匹配的表达式。正规表达式能为你提供远远超过通配符的强有力的控制功能。

本节先向你简短地介绍一下.NET框架中提供的支持使用C#正规表达式的类。有关正规表达式的更多信息,你可以参考《正规表达式快速参考手册》或《精通正规表达式》的第二版。这些书将提供给你需要的信息以便创建你自己的正规表达式,而且还提供了常用正规表达式的一组列表。至于正规表达式本身已经超出本文的讨论范围。

一.校验输入

正规表达式的一种最常用的场所是用于使用一些预先定义的格式(例如,强制建立的规则用于确保口令中包含特定的使其很难被拆断的字符)校验用户输入。这些规则被典型地定义为正规表达式。正规表达式也常用于校验简单的输入,例如电子邮件地址和电话号码。

.NET框架提供的操作正规表达式的一个关键类是RegEx类。这个类提供一个静态的方法IsMatch,它返回一个布尔值指示是否指定的输入字符串匹配一个给定的正规表达式。

在下列代码中,使用一个普通正规表达式来测试电子邮件地址的有效性:

  1. string emailPattern = @"^([/w-/.]+)@((/[[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}/.)|[ccc]  
  2. (([/w-]+/.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(/]?)$";  
  3. Console.Write("Enter an e-mail address:");  
  4. string emailInput = Console.ReadLine();  
  5. bool match = Regex.IsMatch(emailInput, emailPattern);  
  6. if (match)  
  7. Console.WriteLine("E-mail address is valid.");  
  8. else  
  9. Console.WriteLine("Supplied input is not a valid e-mail address."); 

如果你搞不清楚这个正规表达式,别担心。电子邮件模式的基本思想是,它需要一些数字字母字符,后面跟着一个@符号,然后是一些字符组合,再后面跟着一个".",再往后至少跟着两个字符。你可以以不同的输入试验前面的代码来看一下你得到什么结果。即使你不理解该正规表达式本身,只要知道它们的存在,那么你就可以把它使用于你的应用程序中来校验输入。

二.从输入中提取数据

C#正规表达式的其它常见的用法是,根据表达式分析文本以及使用之来从用户输入中提取数据(称作组匹配)。

正规表达式中包括一个特征叫组。一个组允许你把一个命名标识放到该正规表达式的一个特定节中。当你调用Match()来针对模式比较输入数据时,其结果实际上把匹配分成一些组,允许你提取匹配每一个组的输入的部分。

例如,在前面的例子中,我们创建了一个username,它允许我们提取在一个电子邮件地址中位于@符号前的所有数据。然后,当执行一个匹配时,我们能够使用正规表达式的命名组从输入中提取该username。

下列代码显示怎样从一个用户在控制台输入的URL中提取协议名字和端口号。正规表达式的伟大在于,它们使用自己的语言;因此,它们不必依赖于C、C++、C#、VB.NET或任何其它语言。在下列代码中的正规表达式来自于一个MSDN例子:

  1. string urlPattern = @"^(?<proto>/w+)://[^/]+?(?<port>:/d+)?/";  
  2. Console.WriteLine();  
  3. Console.Write("Enter a URL for data parsing: ");  
  4. string url = Console.ReadLine();  
  5. Regex urlExpression = new Regex(urlPattern, RegexOptions.Compiled);  
  6. Match urlMatch = urlExpression.Match(url);  
  7. Console.WriteLine("The Protocol you entered was " + urlMatch.Groups["proto"].Value);  
  8. Console.WriteLine("The Port Number you entered was " + urlMatch.Groups["port"].Value); 

当你使用不带有一个端口号的URL运行前面的代码时,你会注意到,你没有得到任何组值。这是因为,该输入根本不匹配C#正规表达式。当不存在匹配时,你显然无法从给定的组中提取有意义的数据。当你使用匹配该正规表达式的端口号的URL运行前面的代码时,你将得到如下列文本所示的输出结果:

  1. Entera URL for data parsing: http://server.com:2100/home.aspx  
  2. The Protocol you entered was http  
  3. The Port Number you entered was :2100