3.2.2 从输入中抽取数据
正则表达式另一个常见用途是用来分析文本,并从用户的输入中抽取数据(称为组匹配)。C#中的正则表达式包含了一个称为组(group)的独特特征。使用组,可以为正则表达式中特定的段赋予一个标识符名称。当调用match() 方法对模式和输入数据进行比较时,比较的结果实际上是按照组拆分被匹配的符号串,这样就允许你从输入中抽取与每个组相匹配的部分。
例如,我们可以在前一个例子中创建一个名为username的组,用它从一个email地址中提取所有位于@之前的符号串。这样,在执行匹配时,就可以应用正则表达式中的命名组来抽取用户名信息。
看看下面的代码示例,它说明如何从用户在控制台输出的URL地址中同时抽取协议名和端口号。正则表达式的一个良好特性是它自身构成了一个语言,这个语言与C、C++、C#或任何其他编程语言没有依赖关系。这使得我们可以容易地从互联网或参考文献的应用案例中借用某些常用的正则表达式。例如,下面例程中的正则表达式借用自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,程序产生的输出将如下所示:
【责任编辑:
雪花 TEL:(010)68476606-8007】