作者:施懿民
正则表达式
String类型里提供了基础的查找和替换的API,分别是IndexOf和Replace方法,要进行跟复杂的基于模式的搜索匹配操作的话,就需要用到正则表达式。正则表达式允许在大量文本中迅速找到特定的字符模式;可以用来检验文本是否满足预定的模式(如手机号校验);可以提取、编辑、替换甚至移除部分子字符串等操作。.NET中,System.Text.RegularExpressions命名空间中的Regex类就是正则表达式引擎的核心类型。读者如果有DOS或者Linux Bash的操作经验的话,对“*”和“?”这两个通配符应该不会陌生,正则表达式可以看成是通配符的更精细更强大的升级。
代码清单 3 - 7使用正则表达式匹配电话号码
1 // 源码位置:第三章\RegexDemo.cs
2 using System.Text.RegularExpressions;
3 // ...
4 var regex = new Regex("^\\d{3,4}-\\d{7,8}$");
5 Console.WriteLine(regex.IsMatch("021-66106610")); // True
6 Console.WriteLine(regex.IsMatch("0731-6610661")); // True
7 Console.WriteLine(regex.IsMatch("02166106610")); // False
8 Console.WriteLine(regex.IsMatch("21-66106610")); // False
9 Console.WriteLine(regex.IsMatch(" 021-66106610")); // False
代码清单 3 - 7中是正则表达式的一个最常用的场景 – 判断给定的字符串是否匹配预定的模式。第4行中创始化Regex对象的参数就是一个正则表达式字符串,“\d”匹配0 – 9之间任意一个数字字符,由于“\”在字符串中被当作转移字符,所以在模式字符串中需要写成“\\d”的形式。一般来说电话号码是“区号-电话号码”格式,区号通常是3到4个数字,电话号码是7到8个数字,在模式中使用“\\d{3,4}”来匹配区号,“\\d{7,8}”匹配电话号码。“{3,4}”叫做数量限制符,跟在模式字符后面,表明最少匹配次数和最大匹配次数。区号和电话号码之间使用“-”分隔,即如果没有“-”分隔的话就不认为输入字符串是合法的电话号码,如第7行的匹配结果。模式字符串最前面的“^”和最后的“$”字符被称为锚点(Anchor)字符,限定匹配是字符串的最开始,一直匹配到字符串结尾,这个限定条件造成了第9行的匹配失败– 其最前面有一个空格。
由于正则表达式在查找和替换字符串方面实在是太好用了,很多文本编辑器都集成了正则表达式查找替换功能,如Visual StudioIDE和Visual Studio Code。图 3 - 6演示了在Visual Studio Code中使用这个功能的方法,首先需要在查找对话框中勾选最后一个齿轮状选项 – 该选项启用正则表达式匹配功能;接下来在查找文本框中输入正则表达式即可匹配。
图 3 - 6在Visual Studio Code中使用正则表达式查找Unicode字符
笔者在表 3 - 4梳理了一些常用的正则表达式元素,也提供了一个快速参考表供程序员参考,笔者已经下载在本书附带的示例代码中。.NET支持的完整元素列表和相关的说明请读者参阅https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference。
表 3 - 4常用正则表达式元素说明
(织码开门,打开技术学习的大门。)