Advertisement

第九章 正则表达式

阅读量:

9.1 什么是正则表达式

9.1.1定义

正则表达式是表示一组字符串模式的元字符。其构成方式与算术表达式的相似之处在于两者均是由特定的操作符结合而成。
这些特定的操作符即被称为正则表达式的特殊元字符。
其核心功能包括文本匹配和字符串处理任务。
它能够匹配单个字符、完整的字符串以及其中的一部分内容。

9.1.2正则表达式类型

正则表达式有两种类型,分别是:

  • 基本正则表达式

  • 扩展正则表达式
    基本正则表达式具有如下的元字符:

  • 星号 * :匹配它前面的字符串或正则表达式任意次(包括0次)。比如,“1122*”将匹配‘11’+1个或多个2 ,其可能匹配的字符串将是112、1122、1122222、11223343等。

  • 句点 . :匹配除换行符之外的任意一个字符。比如,“112.”将匹配112+至少一个字符,其可能匹配的字符串是1121、1122、112abc等,但不匹配112。

  • 插入符号 ^ :匹配一行的开始,但有时依赖于上下文环境,可能表示否定正则表达式中一个字符串的意思。比如,“^abc”将只匹配行首的abc字符串。

  • 美元符 $ :在一个正则表达式的末尾,匹配一行的结尾。比如,“123”将匹配一个空行。

  • 方括号 [] :匹配方括号内指定的字符集中的一个字符。比如,“[abc]”将匹配字符a、b、c中的任意一个字符,“[a-h]”将匹配从a到h的任意一个字符,“[A-Z][a-z]”将匹配任意一个大写或小写字母,“[^a-d]”将匹配除a到d之外的所有字符。

  • 反斜线符号 \ :转义一个特殊的字符,使这个字符得到字面意义的解释。比如,“”将表示回它的原意“”,而不是表示行尾的的正则表达式含义。类似地,“\”表示的字意是“\”。

  • 转义尖括号 <> :用于标记单词边界。尖括号必须是转义的,否则它们只有字符的字面含义。比如,“”匹配单词“the”,但不匹配“them”、“there”、“other”等等
    扩展正则表达式,在上面的基本正则表达式的元字符的基础上又增加了几个元字符,如下所示:

  • 问号 ? 用于指示前一个字符可选出现一次

  • 加号 + 表示前一模式需重复至少一次

  • 转义波形括号 {} 表示对前一模式重复指定次数

  • 圆括号 ( ) 包含一组可选模式供选择

  • 竖线 | 供选择地执行前后两种模式中的任意一种

9.1.3 POSIX字符类

这是一个指定字符的范围的替代方法:

POSIX字符 含义
[:alnum:] 匹配字母和数字字符。等同于A-Za-z0-9
[:alpha:] 匹配字母字符。等同于A-Za-z
[:blank:] 匹配空格或制表符
[:cntrl:] 匹配控制字符
[:digit:] 匹配十进制数字。等同于0-9
[:graph:] 匹配ASCII码值范围在33-126的字符。与下面的[:print:]相似,但不包括空格字符
[:lower:] 匹配小写字母。等同于a-z
[:upper:] 匹配大写字母。等同于A-Z
[:print:] 匹配ASCII码值范围在32-126的字符。与上面的[:graph:]相似,但多了个空格字符
[:space:] 匹配空白字符(空格和水平制表符)
[:xdigit:] 匹配十六进制数字。等同于0-9A-Fa-f

PS:POSIX字符类通常需用引号或双方括号([[]])括起来。

9.1.4 Bash正则表达式比较操作符

从Bash 3.0版本起,该语言内置了一种用于模式匹配的操作符' =~ '。许多原本通过grep或sed指令编写的正则表达式处理逻辑均可通过引入' =~ '操作符来实现相同效果,并且这种新的实现方式将使代码更加简洁易懂。

与其他比较运算符(如' -lt '或' == '等)相同,在这种情况下(例如,在表达式 $digit =~ '[[]' [^[]]* '[]' ]中),当左边变量匹配右边的正则模式时,则返回状态码0;否则返回1。

复制代码

同样可以检查输入的内容是否为一个数字:

复制代码

Bash正则表达式的复杂度较高。以下是一个示例,在此我们验证变量$ email 是否是一个有效的电子邮件地址:

复制代码

如上所述的例子中所示,在匹配电子邮件地址时第一个正则表达式(账号名)可以包括字母、数字以及一些特殊字符;其中第一个" ] "右边标注的"+"号表示该处可跟随任意数量上述字符。接着是@符号,在用户名与电子邮件域之间发挥作用;而域名第一部分与第二部分之间需使用实际意义的句点(.)来分隔各层次

复制代码

9.2正则应用基础

9.2.1实例:使用句点.匹配单字符

比如,我们有一个文件list.txt,其内容如下所示:

复制代码

现在我们来搜索此文件中,包含字符串“112”且其后至少有一个字符的行:

复制代码

查找在字符“d”和“e”之间有一个任意字符的行:

复制代码

查找在字符“2”后有两个任意字符的行:

复制代码

9.2.2 实例:使用插入符号^匹配

为了查找/etc/passwd文件中root账号的信息;如果仅通过关键字搜索而不使用正则表达式;可能会得到类似以下的结果:

复制代码

然而,在之前的计算中所得到的结果并非我们期望得到的理想结果。接着,在这种情况下,我们可以采取措施来实现目标:通过在代码中插入特定的元字符即可达到仅显示root账号信息的目的。

复制代码

为了方便查阅,在Linux系统中/ va/log/message这一特定目录下存储着各种类型的信息,并非实时更新的状态数据。如果需要关注的是仅限于2023年11月1日的日志记录,则可以通过正则表达式的应用来实现相应的筛选功能。

复制代码

9.2.3 实例:使用美元符$匹配

将插入符号“^”和美元符“$”单独结合使用,可以查找文件中空白行:

复制代码

上述示例是打印除空行以外的其它行。

使用美元符“$”匹配,我可以查找/etc/passwd中用户默认Shell是Bash的账号:

复制代码

上述示例中,查找的即是以“bash”字符串结尾的行。

9.2.4 实例:使用星号*匹配

我们在Linux系统日志文件/va/log/messages中进行了详细搜索,并定位到所有符合以'kernel: *'为关键词的记录

复制代码

在示例中, 我们识别了kernel及其后续冒号「:」, 并检查了紧随其后的零个或多个空格以及最后一个句点「.」, 以确保匹配到任意一个字符.

以下是一个案例:被用来搜索文件中所有以字母' i '开头并以字母' l '结尾的单词字符所在的行。

复制代码

复制代码

9.2.5 实例:使用方括号[ ]匹配

比如,找出文件中含有至少11个连续小写字母的行:

复制代码

复制代码

查看文件中包含字母‘b’或字母‘s’的行:

复制代码

查看系统日志文件中包含“数字+空格+times”的行:

复制代码

复制代码

9.2.6 实例:使用问号?匹配

比如,我们有一个内容如下的文件regexExamp.txt:

复制代码

我们来查看一下“hi ?hello”的匹配结果:

复制代码

复制代码

9.2.7 实例:使用加号+匹配

我们仍然继续使用上一节中的示例文档regexExamp.txt进行观察。查看‘hi + hello’匹配的情况将会如何呈现:

复制代码

复制代码

9.3 小结

  • 下面我们总结一下本章所学的主要知识:
    • 正则表达式是一种描述字符串集合的模式工具。
    • 正则表达式由普通字符与元字符组成;它不仅能够匹配一个特定模式还可以指定多个可能匹配。
    • 其主要用途在于进行文本搜索以及处理字符串内容。
    • 正则表达式分为两种类型:基础型与扩展型。
    • 基础型正则表达式的元字符包括星号*点.caret^美元符$方括号[]反斜杠\以及小于大于<>等特殊符号。
    • 扩展型正则表达式在基础型的基础上增加了问号?加号+花括号{}括号()竖线|等新特性。
    • 遵循POSIX规范的字符集合通常需要用双引号或者方括号[[]]来表示。
    • 自Bash版本3.0起,默认内置了内部正则表达式比较运算符"~="

全部评论 (0)

还没有任何评论哟~