二、 使用正规表达式 正规表达式允许快速有效地处理文本。被处理的文本小到一个电子邮件地址,大到一个多行的输入框内容。正规表达式的使用不仅允许你使用一个定义模式来校验文本,而且还允许你从匹配一个给定模式的文本中提取数据。
你可以把一个正规表达式当作是一种特别强有力的通配符。当我们看到象"SAMS*"这样的表达式时,我们都会熟悉通配符,任何以单词SAMS开头的内容都是一个匹配的表达式。正规表达式能为你提供远远超过通配符的强有力的控制功能。
本节先向你简短地介绍一下.NET框架中提供的支持使用正规表达式的类。有关正规表达式的更多信息,你可以参考《正规表达式快速参考手册》或《精通正规表达式》的第二版。这些书将提供给你需要的信息以便创建你自己的正规表达式,而且还提供了常用正规表达式的一组列表。至于正规表达式本身已经超出本文的讨论范围。
(一) 校验输入
正规表达式的一种最常用的场所是用于使用一些预先定义的格式(例如,强制建立的规则用于确保口令中包含特定的使其很难被拆断的字符)校验用户输入。这些规则被典型地定义为正规表达式。正规表达式也常用于校验简单的输入,例如电子邮件地址和电话号码。
.NET框架提供的操作正规表达式的一个关键类是RegEx类。这个类提供一个静态的方法IsMatch,它返回一个布尔值指示是否指定的输入字符串匹配一个给定的正规表达式。
在下列代码中,使用一个普通正规表达式来测试电子邮件地址的有效性:
string emailPattern = @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|[ccc] (([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"; Console.Write("Enter an e-mail address:"); string emailInput = Console.ReadLine(); bool match = Regex.IsMatch(emailInput, emailPattern); if (match) Console.WriteLine("E-mail address is valid."); else Console.WriteLine("Supplied input is not a valid e-mail address."); |
如果你搞不清楚这个正规表达式,别担心。电子邮件模式的基本思想是,它需要一些数字字母字符,后面跟着一个@符号,然后是一些字符组合,再后面跟着一个".",再往后至少跟着两个字符。你可以以不同的输入试验前面的代码来看一下你得到什么结果。即使你不理解该正规表达式本身,只要知道它们的存在,那么你就可以把它使用于你的应用程序中来校验输入。
(二) 从输入中提取数据
正规表达式的其它常见的用法是,根据表达式分析文本以及使用之来从用户输入中提取数据(称作组匹配)。
正规表达式中包括一个特征叫组。一个组允许你把一个命名标识放到该正规表达式的一个特定节中。当你调用Match()来针对模式比较输入数据时,其结果实际上把匹配分成一些组,允许你提取匹配每一个组的输入的部分。
例如,在前面的例子中,我们创建了一个username,它允许我们提取在一个电子邮件地址中位于@符号前的所有数据。然后,当执行一个匹配时,我们能够使用正规表达式的命名组从输入中提取该username。
下列代码显示怎样从一个用户在控制台输入的URL中提取协议名字和端口号。正规表达式的伟大在于,它们使用自己的语言;因此,它们不必依赖于C、C++、C#、VB.NET或任何其它语言。在下列代码中的正规表达式来自于一个MSDN例子:
string urlPattern = @"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/"; Console.WriteLine(); Console.Write("Enter a URL for data parsing: "); string url = Console.ReadLine(); Regex urlExpression = new Regex(urlPattern, RegexOptions.Compiled); Match urlMatch = urlExpression.Match(url); Console.WriteLine("The Protocol you entered was " + urlMatch.Groups["proto"].Value); Console.WriteLine("The Port Number you entered was " + urlMatch.Groups["port"].Value); |
当你使用不带有一个端口号的URL运行前面的代码时,你会注意到,你没有得到任何组值。这是因为,该输入根本不匹配正规表达式。当不存在匹配时,你显然无法从给定的组中提取有意义的数据。当你使用匹配该正规表达式的端口号的URL运行前面的代码时,你将得到如下列文本所示的输出结果:
Entera URL for data parsing: http://server.com:2100/home.aspx The Protocol you entered was http The Port Number you entered was :2100 |
三、 总结 在本文中,你已看到现在你有了自己的字符串例程库。借助于C#和.NET框架,字符串成为该基类库的一个本机组成部分,并且提供给你大量的工具方法用于实现字符串的比较,操作,格式化等操作。你还看到,StringBuilder类向你提供了一组易于使用的工具方法以便动态地构建字符串而不会带来本地字符串连接的性能损失。
最后,本文向你简短介绍了正规表达式的威力以及Regex类是如何把这些功能整合到一起的。通过阅读本文和试验相应的示例代码后,你应该熟悉一些字符串和正规表达式操作以使你的应用程序更为有力。
查看本文来源