1 为什么使用正则表达式

正则表达式(regular expression)是对字符串操作的一种逻辑公式。正则表达式的应用范围非常广泛,最初是由UNIX普及开来的,后来广泛运用于Scala、PHP、C#、Java、C++、Objective-C、Perl、Swift、VBScript、JavaScript、Ruby及Python等。学习正则表达式,实际上是学习一种十分灵活的逻辑思维,通过简单、快速的方法达到对字符串的控制。可以说正则表达式是程序员手中一种威力无比强大的武器!

正则表达式大有用处,这里简要介绍几种常见的用途。

● 测试字符串内的模式。可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。

● 替换文本。可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换。

● 基于模式匹配从字符串中提取子字符串。可以查找文档内或输入域内特定的文本等并删除或替换。例如,你可能需要搜索整个网站,删除过时的材料,以及替换某些HTML格式标记。在这些情况下,可以使用正则表达式来确定每个文件中是否出现相应材料或HTML格式标记。此过程将受影响的文件范围缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料。最后,可以使用正则表达式来搜索和替换HTML格式标记。

总结下来,正则表达式最核心的功能就是搜索和替换。接下来我们以VS Code开发环境下搜索和替换中使用的正则表达式为例来学习正则表达式的基本用法,在其他环境下的正则表达式的用法规则基本大同小异。

由于Vim文本编辑器非常高效,且具有悠久的历史和广泛的用户群,因此我们将同时介绍正则表达式在Vim文本编辑器中的用法。在VS Code开发环境的基础上可以通过安装Vim文本编辑器插件的方式使用Vim文本编辑器。

2 第一关:基本的字符串搜索方法

在VS Code中跨文件搜索(Ctrl+Shift+F)和文件内搜索(Ctrl+F)的输入文本框中输入字符串即可进行基本的字符串搜索。图3-1所示左侧搜索面板为跨文件搜索的结果,右侧为文件内搜索的结果。

图3-1 VS Code中跨文件搜索和文件内搜索的结果

使用文件内搜索功能时,可以按Shift+Enter快捷键搜索上一个,按Enter键继续搜索下一个。这两种操作在文件内搜索面板上有对应的向上、向下箭头,向下箭头右侧3条横线的按钮是指在选定内容中查找(Alt+L)。

跨文件搜索和文件内搜索的输入文本框内部右侧都有3个按钮。

● 选中第一个表示搜索时区分大小写(Alt+C)。

● 选中第二个表示搜索时全字匹配(Alt+W)。

● 选中第三个表示搜索时采用正则表达式(Alt+R),如果在输入文本框中使用了正则表达式的语法规则,则需要选中第三个按钮或按Alt+R快捷键。显然如图3-1所示的输入没有使用正则表达式。

在Vim文本编辑器的一般命令模式(Normal Mode)下按/输入文本main(与按:进入底线命令模式类似的方式),即在当前文档中向光标之下寻找文本模式为main的字符串。例如要在文件内搜寻RegEx这个字符串,输入/RegEx按Enter键即可。在底部的状态栏可以看到输入的搜索命令/RegEx,按Enter键之后光标就停在搜索到的下一个RegEx字符串上。相应地,” />

图3-2 VS Code中在选定内容区域内查找多个字符串

在Vim文本编辑器中搜索多个字符串的方法与在VS Code中的基本一致。如果你想匹配“yes”或“no”,你需要使用的正则表达式是/yes|no。

你也可以同时搜索超过两个字符串,通过添加更多的或运算符来分隔它们,如/yes|no|maybe。

4 第三关:在匹配字符串时的大小写问题

到目前为止,你已经知道使用正则表达式进行字符串匹配的方法了。但有时,你也可能想要匹配具有大小写差异的字符串。比如大写字母“A”、“B”和“C”,小写字母“a”、“b”和“c”。

在VS Code跨文件搜索和文件内搜索中,默认是忽略大小写的,只有通过选中搜索输入文本框中区分大小写的按钮,才会按照大小写严格匹配字符串。

在Vim文本编辑器中可通过底线命令方式:set ignorecase将其设置为忽略大小写,可通过:set noignorecase使其恢复到大小写敏感的状态。Vim文本编辑器默认是大小写敏感的。

类UNIX操作系统默认都是大小写敏感的,而Windows操作系统默认是大小写不敏感的。这大概是VS Code和Vim文本编辑器在大小写的默认设置上不同的原因吧。

在Vim文本编辑器中也可以通过\c表示大小写不敏感,\C表示大小写敏感。比如/ignorecase\c,表示可以匹配“ignorecase”、“igNoreCase”和“IgnoreCase”等。

注意:有些环境下你可以使用/i标志来指明是否忽略大小写。你可以通过将/i标志附加到正则表达式中来使用,使用/i标志的示例是/ignorecase/i,表示可以匹配“ignorecase”、“igNoreCase”和“IgnoreCase”等。

在VS Code跨文件搜索和文件内搜索中不支持在正则表达式中使用\c或/i这种标志。

5 第四关:通配符的基本用法

有时不知道文件中的确切字符,就找出所有可能与之匹配的单词,但如果拼写错误会浪费很长时间。幸运的是,可以使用通配符“.”“+”“*”“” />

图3-3 VS Code中基本的字符串搜索替换方法

在Vim文本编辑器中,基本的字符串搜索替换正则表达式为:n1,n2s/word1/word2/g,它以:开头,n1与n2为数字,即在第n1与n2行之间寻找word1这个字符串,并将该字符串替换为 word2 字符串。举例来说,在第100到200行之间搜寻regex并将其替换为RegEx的表达式为:100,200s/regex/RegEx/g。

其中s是substitute的简写,表示执行替换字符串操作;最后的/g是global的简写,表示全局替换。另外与/g的用法相似,/c是confirm的简写,表示操作时需要确认,/i是ignorecase的简写,表示不区分大小写。

:1,$s/word1/word2/g或:%s/word1/word2/g表示从第一行到最后一行寻找word1字符串,并将该字符串替换为word2字符串。

:1,$s/word1/word2/gc或:%s/word1/word2/gc表示从第一行到最后一行寻找word1字符串,并将该字符串替换为word2字符串,且在替换前显示提示信息给用户确认是否需要替换。

11 第十关:在替换中使用捕获组复用模式

如果我们在搜索替换中希望保留搜索字符串中的某些字符串作为替换字符串的一部分,可以使用符号“$”访问搜索字符串中的捕获组。

比如在搜索正则表达式中的捕获组为capture groups,则替换的正则表达式中可以直接使用$1复用搜索正则表达式中的捕获组capture groups。

在VS Code中,如果想将项目中所有的HTML标签中的h改为H,搜索正则表达式就可以查找出所有标签,如

等,其中还定义了捕获组(\d)。

替换的正则表达式使用$1复用了搜索正则表达式中定义的捕获组(\d),如图3-4所示。

图3-4 使用$1复用了搜索正则表达式中定义的捕获组(\d)

在Vim文本编辑器中,复用捕获组进行替换的方法为:1,$s/(capture groups)/$1/g。如果想在当前文件中将所有的HTML标签中的h改为H,则正则表达式为:1,$s///g。

本文摘自:代码中的软件工程

本书共五篇:第一篇介绍常用工具VS Code、Git和正则表达式;第二篇以C语言代码为例介绍工程化编程的基本方法,涵盖代码的风格和规范、模块化、可复用、可重入函数与线程安全等;第三篇介绍从需求分析到软件设计的基本建模方法——从需求分析开始,以UML为工具完成用例建模、业务领域建模、对象交互建模,最终形成设计方案;第四篇探讨软件的元素、结构、特性和描述方法,以及高质量软件的内涵等;第五篇回顾软件危机的前因后果,并将之与PSP、TSP、CMM/CMMI、敏捷开发、DevOps等软件过程和生命周期管理衔接起来。

本书以国家精品在线开放课程——“工程化编程实战”为核心内容,增加了常用工具、需求分析与建模方法、软件结构和软件过程等相关内容,内容全面、新颖,实践性强。本书主要针对在校学生编写,适合开设相关专业的普通高校和高职院校作为主要教材,也可供不同层次的自学者学习参考。