快速学习正则表达式,不用死记硬背,示例让你通透(上篇)

快速学习正则表达式,不用死记硬背,示例让你通透(上篇)
最新回答
快乐暗恋我

2021-06-04 20:10:58

快速学习正则表达式(上篇)

正则表达式是一种强大的文本处理工具,它允许你定义模式模板来匹配和过滤文本。以下是正则表达式的快速学习指南,通过示例让你通透理解正则表达式的核心概念。

一、正则表达式的定义

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

正则表达式模式利用通配符来描述数据流中的一个或多个字符。在Linux中,通配符常用于描述不确定的数据,例如*号。

二、正则表达式的类型

使用正则表达式最大的问题在于有多种类型的正则表达式。Linux中的不同应用程序可能会用不同类型的正则表达式,包括编程语言(如Java、Perl、Python)、Linux实用工具(如sed、gawk、grep)以及主流应用(如MySQL、PostgreSQL)。

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

  • POSIX基础正则表达式(BRE)引擎
  • POSIX扩展正则表达式(ERE)引擎

POSIX BRE引擎通常出现在依赖正则表达式进行文本过滤的编程语言中,而awk程序用ERE引擎来处理正则表达式模式。

三、定义BRE模式

最基本的BRE模式是匹配数据流中的文本字符。

3.1 纯文本

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

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

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

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

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

在正则表达式中,空格和其他的字符并没有什么区别。如果在正则表达式中定义了空格,那么它必须出现在数据流中。

  • 演示说明:空格的出现无法和文本内容匹配。

可以创建匹配多个连续空格的正则表达式模式。

  • 演示说明:单词间有两个空格的行匹配正则表达式模式。

3.2 特殊字符

正则表达式识别的特殊字符包括:.*[]^${}+?|()。如果要用某个特殊字符作为文本字符,就必须转义,即在它前面加一个反斜杠()。

  • 示例说明:查找文本中的美元符,只要在它前面加个反斜线。

3.3 锚字符

默认情况下,当指定一个正则表达式模式时,只要模式出现在数据流中的任何地方,它就能匹配。有两个特殊字符可以用来将模式锁定在数据流中的行首或行尾。

3.3.1 锁定在行首

脱字符(^)定义从数据流中文本行的行首开始的模式。如果模式出现在行首之外的位置,正则表达式模式则无法匹配。

  • 示例解说:脱字符会在每个由换行符决定的新数据行的行首检查模式。

  • 示例解说:只要模式出现在新行的行首,脱字符就能够发现它。

  • 演示说明:脱字符出现在正则表达式模式的尾部,sed编辑器会将它当作普通字符来匹配。

注意:如果指定正则表达式模式时只用了脱字符,就不需要用反斜线来转义。但如果在模式中先指定了脱字符,随后还有其他一些文本,那么必须在脱字符前用转义字符。

3.3.2 锁定在行尾

美元符($)定义了行尾锚点。将这个特殊字符放在文本模式之后来指明数据行必须以该文本模式结尾。

3.3.3 组合锚点

可以在同一行中将行首锚点和行尾锚点组合在一起使用。

  • 示例说明:匹配文本中以test开头和以test结尾的行。

将两个锚点直接组合在一起,之间不加任何文本,可以过滤出数据流中的空白行。

  • 示例说明:定义的正则表达式模式会查找行首和行尾之间什么都没有的那些行。由于空白行在两个换行符之间没有文本,刚好匹配了正则表达式模式。sed编辑器用删除命令d来删除匹配该正则表达式模式的行,因此删除了文本中的所有空白行。

3.4 点号字符

特殊字符点号(.)用来匹配除换行符之外的任意单个字符。它必须匹配一个字符,如果在点号字符的位置没有字符,那么模式就不成立。

  • 示例解说:第一行无法匹配,因为at前面没有字符来匹配点号字符;而第二行和第三行可以匹配,因为at前面有空格字符;第四行中,at前面的空格刚好匹配了点号字符;第五行将at放在行首,没有字符来匹配点号字符,所以无法匹配。

3.5 字符组

使用方括号来定义一个字符组。方括号中包含所有你希望出现在该字符组中的字符。然后可以在模式中使用整个组,就跟使用其他通配符一样。

  • 示例说明:匹配这个模式的单词