快速学习正则表达式,不用死记硬背,示例让你通透(上篇)
Posted 涤生手记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速学习正则表达式,不用死记硬背,示例让你通透(上篇)相关的知识,希望对你有一定的参考价值。
一、正则表达式的定义:
正则表达式是你所定义的 模式模板 ( pattern template ), Linux 工具可以用它来过滤文本。 Linux工具(比如sed 编辑器或 gawk 程序)能够在处理数据时使用正则表达式对数据进行模式匹配。如果数据匹配模式,它就会被接受并进一步处理;如果数据不匹配模式,它就会被滤掉。
示例说明:
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 模式
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 字符组
示例说明:
匹配这个模式的单词只有 cat 和 hat 。还要注意以 at 开头的行也没有匹配。字符组中必须有个字符来匹配相应的位置。
示例说明:
这个正则表达式模式匹配了任意含有数字 0 、 1 、 2 或 3 的行。含有其他数字以及不含有数字的行都会被忽略掉。
示例说明:
正则表达式模式可见于数据流中文本的任何位置。经常有匹配模式的字符之外的其他字符。如果要确保只匹配五位数,就必须将匹配的字符和其他字符分开,要么用空格,要么像这个例子中这样,指明它们就在行首和行尾。
3.6 排除型字符组
在正则表达式模式中,也可以反转字符组的作用。可以寻找组中没有的字符,而不是去寻找组中含有的字符。要这么做的话,只要在字符组的开头加个脱字符。
示例说明:
使用排除型字符组,正则表达式模式会匹配 c 或 h 之外的任何字符以及文本模式。由于空格字符属于这个范围,它通过了模式匹配。但即使是排除,字符组仍然必须匹配一个字符,所以以 at开头的行仍然未能匹配模式。
3.7 区间
示例说明:
新的模式 [c-h]at 匹配了首字母在字母 c 和字母 h 之间的单词。这种情况下,只含有单词 at的行将无法匹配该模式。
示例说明:
该字符组允许区间a~c、h~m中的字母出现在at文本前,但不允许出现d~g的字母。
3.8 特殊的字符组
- [[: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 星号【*】
以上是关于快速学习正则表达式,不用死记硬背,示例让你通透(上篇)的主要内容,如果未能解决你的问题,请参考以下文章