正则表达式(regular expression)是用来快速高效地处理文本数据的工具被处理的文本可以小到一个电子邮件地址也可以大到一个多行文本输入框中的文本数据正则表达式不仅可用来确认一段文本是否与一个预定义的模式相匹配还可以用于从文本中抽取符合某一模式的数据
正则表达式可以被看成是一个强大的通配符(通用匹配符号)大多数人都应该很熟悉通配符例如当我们看到一个诸如SAMS的表达式那么一个文本串中任何以SAMS开头的字符串都可以与这个表达式匹配正则表达式提供了比这种通配符能力更强控制规则更复杂功能更完善的匹配机制
本文将对NET框架提供的支持正则表达式的类做一个概要介绍要想获得有关正则表达式的更多知识可参考《Regular Expression Pocket Reference 》(OReilly Media出版社ISBNX)或《Mastering Regular Expressions》nd Edition (OReilly Media出版社ISBN)等书籍它们可以教会你如何创建正则表达式并提供了最常用的正则表达式列表
输入确认
正则表达式最重要的用途之一是确认某个输入的文本是否符合一个预定义的格式例如一个能够作为密码的字符串通常要遵循某些强制的规则以使得密码字符串难以被破解这些规则常常被定义为正则表达式正则表达式也常常用来对一些简单的输入执行确认如确认email地址和电话号码
RegEx类是NET框架中一个处理正则表达式的关键类RegEx类包含了一个名为IsMatch的静态方法它返回一个布尔值这个布尔值说明指定的输入串是否与一个给定的正则表达式匹配
下面的代码中用到了一个常用的正则表达式用来测试一个email地址是否有效
string emailPattern = @^([\w\]+)@((\[[]{}\[]{}\[]{}\)||[ccc] (([\w]+\)+))([azAZ]{}||[]{})(\]?)$; ConsoleWrite(Enter an email address:);string emailInput = ConsoleReadLine();bool match = RegexIsMatch(emailInput emailPattern);if (match)ConsoleWriteLine(Email address is valid);elseConsoleWriteLine(Supplied input is not a valid email address);
不要担心上面的正则表达式是否有意义电子邮件模式背后隐藏的基本思想是它必须包含一些字符然后是一个@标记接着是跟在之后的一些字符组合之后至少要有两个字符你可以试着在上面的程序段中使用不同的文本作为输入并观察程序执行的结果即使你不理解正则表达式本身的含义也没有关系只要知道存在正则表达式这样一种工具并且它可以用来对输入进行确认这对于你编写应用程序将是极有帮助的
从输入中抽取数据
正则表达式另一个常见用途是用来分析文本并从用户的输入中抽取数据(称为组匹配)
C#中的正则表达式包含了一个称为组(group)的独特特征使用组可以为正则表达式中特定的段赋予一个标识符名称当调用match()方法对模式和输入数据进行比较时比较的结果实际上是按照组拆分被匹配的符号串这样就允许你从输入中抽取与每个组相匹配的部分
例如我们可以在前一个例子中创建一个名为username的组用它从一个email地址中提取所有位于@之前的符号串这样在执行匹配时就可以应用正则表达式中的命名组来抽取用户名信息
看看下面的代码示例它说明如何从用户在控制台输出的URL地址中同时抽取协议名和端口号正则表达式的一个良好特性是它自身构成了一个语言这个语言与CC++C#或任何其他编程语言没有依赖关系这使得我们可以容易地从互联网或参考文献的应用案例中借用某些常用的正则表达式例如下面例程中的正则表达式借用自MSDN中的一个例子
string urlPattern = @^(?
\w+)://[^/]+?(?
:\d+)?/;ConsoleWriteLine();ConsoleWrite(Enter a URL for data parsing: );string url = ConsoleReadLine();Regex urlExpression = new Regex(urlPattern RegexOptionsCompiled);Match urlMatch = urlExpressionMatch(url);ConsoleWriteLine(The Protocol you entered was + urlMatchGroups[proto]Value);ConsoleWriteLine(The Port Number you entered was + urlMatchGroups[port]Value);
运行上面的例程时如果为它输入一个没有端口号的URL你将会注意到程序不输入任何组的匹配值这是因为输入的文本与正则表达式根本不匹配当输入与正则表达式不匹配时显然就不能够利用任何命名的组来抽取有意义的数据如果为上面的例程输入一个带端口号并且与正则表达式匹配的URL程序产生的输出将如下所示
Enter a URL for data parsing: xThe Protocol you entered was httpThe Port Number you entered was :