20.5 正则表达式
相信大家都有在电脑上查找某个文件的经历,例如需要把C盘中所有的Word文档给找出来,很简单,只需要按"Win+F"快捷键,调出系统的搜索窗口,然后在文件名窗口输入".doc",单击“搜索”按钮后Windows就会找到所有的Word文档。如果改变搜索目标,改为"w.doc",那么Windows就会找出所有以字母w开头的Word文档,如图20-2所示。
图 20-2 查找符合"w*.doc"条件的文件
为什么Windows知道我们要找的是Word文档?为什么它会把所有的Word文档都找出来?秘密就在".doc",这里的是通配符,表示文件名不限,可以匹配任何的文件名;而.doc是扩展名。可见,就是这样一个描述了查询目标特征的字符串,让系统了解了我们的查询目标。
正则表达式也类似一个字符串,它描述了目标字符串的特征。正则表达式引擎正是使用这种特征,实现了在一大堆的字符串中查找或者替换我们符合要求的字符串。先来看一个简单的正则表达式:"hi",使用这个正则表达式可以在"aabbhibbaahiaa"中将两个"hi"字符串给找出来,简单吧!因此也不必把正则表达式想象的太复杂、很难于使用,其实只要我们遵循由易到难的原则,多动手,勤练习,每个人都可以掌握“正则表达式”这样一个强大的工具。
我们知道,正则表达式在很多领域都得到了广泛应用,例如:
❑在B/S应用程序的前端表达验证中,我们使用正则表达式来验证诸如电子邮件、网址、日期等的格式是否正确,以及用户名、密码的合法性等。
❑在网络爬虫应用程序中,可以使用正则表达式来分析网页的源代码HTML,找出其中的URL等有用信息。
❑在文本/代码编辑器应用程序中,可以使用正则表达式来查找某个特定的字符串,甚至可以将之替换为别的特定字符串。
我们总结一下,看看正则表达式能做些什么,如下:
❑验证字符串是否符合指定的模式,例如验证指定的字符串是否是合法的电话号码、电子邮件等。
❑替换文本。可以使用正则表达式搜索文档中的特定文本,将找到的文本删除或者替换成其他的文本。
❑查找字符串。这个比较容易理解,就是在文档中找到符合正则表达式规定模式的字符串,鉴于正则表达式的模式可以进行非常灵活的定义,因此在模式匹配时可以搜索任意模式的字符串。
20.5.1 正则表达式基本语法
很多语言都提供了对于正则表达式的支持,C#自然也不例外。在这一节中,我们的学习目标就是C#中支持的正则表达式语法。注意,由于内容较多,暂时无法理解或者看不太懂比较正常,正则表达式的学习曲线确实有点陡峭。因此,还是那句老话,建议读者朋友多动手,多实践,手脑结合,才更有助于理解。
使用正则表达式处理文本或字符串至少要有两个输入项,然后正则表达式引擎才可以根据这两个输入来输出结果。这两个输入项如下。
❑使用正则表达式语法编写的模式字符串。
正则表达式有其独特的语法定义,虽然很多语言都支持正则表达式,但其语法不尽相同,C#中支持的正则表达式语法和Perl 5中的语法相兼容,而且还添加了一些其他特性,诸如从右到左匹配。
❑需要分析的文本或者字符串。
第二个输入项不需要多说,关键在于第一个输入项。要编写一个模式字符串,就需要十分地熟悉正则表达式的语法,这也正是本节的目标。由于正则表达式的内容实在太多,因此这里挑选了其中一些比较重要的,或者比较常用的部分语法进行介绍。在讲到的某些语法点,还提供了一些示例,以帮助读者理解。
言归正传,本节要介绍的语法内容主要分成如下几个部分:字符转义、定位点、字符类、限定符、分组构造以及替换构造。接下来将对上述六类语法点逐一进行介绍。
首先是字符转义,这里的转义主要是指当一个反斜杠(\)和某些字符放在一起时代表的一些特殊含义,主要包括以下两种情况(注意,这里只是列出了一小部分转义符):
❑其后的字符是一个特殊的字符。例如\b指示正则表达式匹配应在单词边界上开始的定位点,\t表示一个制表符,而\x020表示空格。
❑按某些字符的原意解释,避免解释成其他含义。例如,大括号"{"是开始限定符的定义,但反斜杠后接大括号"{"表示正则表达式引擎应匹配大括号。同样,一个反斜杠标志转义语言构造的开头,但两个反斜杠(\)则指示正则表达式引擎应匹配反斜杠(\)。
具体的转义符列表如表20-7所示。
定位点主要作用是指示字符串中必须发生匹配的位置,如果正则表达式中使用了定位点,那么引擎就不会在字符串的其他位置搜索,而是只在定位点指示的位置搜索,例如$指示必须从字符串的末尾或者行尾开始搜索,而^则指示从开头开始搜索,具体的定位点列表如表20-8所示。
字符类与一组字符中的任何一个字符匹配,表20-9列出了字符类的语言元素。
限定符指定在输入中必须存在字符、组或字符类的多少个实例才能找到匹配项,表20-10是限定符列表。
分组构造用于匹配输入字符串中重复的子表达式,表20-11是分组构造语言元素的列表。
替换构造用于修改正则表达式,以支持either/or或条件匹配,表20-12是替换构造的元素列表。