十分钟上手正则表达式 上篇

2022-04-14 22:17:04
目录
一、正则表达式的定义:二、正则表达式的类型三、定义 BRE 模式3.1 纯文本3.2 特殊字符3.3 锚字符3.3.1 锁定在行首3.3.2 锁定在行尾3.3.3 组合锚点3.4 点号字符3.5 字符组3.6 排除型字符组3.7 区间3.8 特殊的字符组3.9 星号【*】

十分钟上手正则表达式 上篇

一、正则表达式的定义:

正则表达式是你所定义的 模式模板 ( pattern template ), linux 工具可以用它来过滤文本。 Linux工具(比如sed 编辑器或 gawk 程序)能够tCWuG在处理数据时使用正则表达式对数据进行模式匹配。如果数据匹配模式,它就会被接受并进一步处理;如果数据不匹配模式,它就会被滤掉。

正则表达式模式匹配数据:

十分钟上手正则表达式 上篇

正则表达式模式利用通配符来描述数据流中的一个或多个字符。 Linux 中有很多场景都可以 使用通配符来描述不确定的数据。【*】号在我们工作中就比较常用。

十分钟上手正则表达式 上篇

示例说明:

a.*参数会让ls命令只列出名字以a开头的文件。文件名中a之后可以有任意多个字符(包括什么也没有)。ls命令会读取目录中所有文件的信息,但只显示跟通配符匹配的文件的信息。

二、正则表达式的类型

使用正则表达式最大的问题在于有不止一种类型的正则表达式。 Linux 中的不同应用程序可能会用不同类型的正则表达式。这其中包括编程语言(java 、 Perl 和 python )、 Linux 实用工具(比 如sed 编辑器、 gawk 程序和 grep 工具)以及主流应用(比如 mysql 和 PostgreSQL 数据库服务器)。正则表达式是通过正则表达式引擎( regular expression engine )实现的。正则表达式引擎是一套底层软件,负责解释正则表达式模式并使用这些模式进行文本匹配。

两种流行的正则表达式引擎:

POSIX基础正则表达式(basic regular expression,BRE)引擎 POSIX扩展正则表达式(extended regular expression,ERE)引擎

POSIX BRE引擎通常出现在依赖正则表达式进行文本过滤的编程语言中。它为常见模式提供了高级模式符号和特殊符号,比如匹配数字、单词以及按字母排序的字符。awk程序用ERE引擎来处理它的正则表达式模式。

说明:

由于实现正则表达式的方法太多,很难用一个简洁的描述来涵盖所有可能的正则表达式。后面会结合sed和awk演示最常见的正则表达式。

三、定义 BRE 模式

最基本的 BRE模式是匹配数据流中的文本字符。下面会演示如何在正则表达式中定义文本以及会得到什么样的结果。

3.1 纯文本

十分钟上手正则表达式 上篇

演示说明:

模式定义了一个单词 test 。 sed 编辑器和 gawk 程序脚本用它们各自的 print 命令打印出匹配该正则表达式模式的所有行。由于echo 语句在文本字符串中包含了单词 test ,数据流文本能够匹配所定义的正则表达式模式,编辑器能显示该行。

正则表达式是区分大小写的:

十分钟上手正则表达式 上篇

演示说明:

第一次尝试没能匹配成功,因为 this 在字符串中并不都是小写,而第二次尝试在模式中使 用大写字母,所以能正常输出。

在正则表达式中,你不用写出整个单词。只要定义的文本出现在数据流中,正则表达式就能 够匹配。

十分钟上手正则表达式 上篇

演示说明:

数据流中的文本是 books ,在数据中含有正则表达式 book ,因此正则表达式模式跟数据匹配。

在正则表达式中,空格和其他的字符并没有什么区别。

十分钟上手正则表达式 上篇

演示说明:

空格的出现无法和文本内容匹配。

如果在正则表达式中定义了空格,那么它必须出现在数据流中。甚至可以创建匹配多个连续空格的正则表达式模式。

十分钟上手正则表达式 上篇

演示说明:

单词间有两个空格的行匹配正则表达式模式。

3.2 特殊字符

正则表达式识别的特殊字符包括:

格字 符属于这个范围,它通过了模式匹配。但即使是排除,字符组仍然必须匹配一个字符,所以以 at开头的行仍然未能匹配模式。

3.7 区间

十分钟上手正则表达式 上篇

示例说明:

新的模式 [c-h]at 匹配了首字母在字母 c 和字母 h 之间的单词。这种情况下,只含有单词 at 的行将无法匹配该模式。

十分钟上手正则表达式 上篇

示例说明:

该字符组允许区间a~c、h~m中的字母出现在at文本前,但不允许出现d~g的字母。

3.8 特殊的字符组

除了定义自己的字符组外, BRE 还包含了一些特殊的字符组,可用来匹配特定类型的字符。

[[:alpha:]] 匹配任意字母字符,不管是大写还是小写 [[:alnum:]] 匹配任意字母数字字符0~9、A~Z或a~z [[:blank:]] 匹配空格或制表符 [[:digit:]] 匹配0~9之间的数字 [[:lower:]] 匹配小写字母字符a~z [[:print:]] 匹配任意可打印字符 [[:punct:]] 匹配标点符号 [[:space:]] 匹配任意空白字符:空格、制表符、NL、FF、VT和CR [[:upper:]] 匹配任意大写字母字符A~Z

十分钟上手正则表达式 上篇

示例说明:

使用特殊字符组可以很方便地定义区间。可以用 [[:digit:]] 来代替区间 [0-9] 。

3.9 星号【*】

在字符后面放置星号表明该字符必须在匹配模式的文本中出现 0 次或多次。

十分钟上手正则表达式 上篇