NoteDeep
在前面的笔记中,我们曾经了解了"."的意思是表示任意单个字符,但如果我们对单个任意字符做更加细致的查找呢?比如任意单个字符必须是字母或者数字等等,又该如何查找呢?

为此和前面笔记一样,我们先创建一个名为regextest的文件,其内容入下:
[root@localhost135 ~]# cat -n regextest
1 a
2 a6d
3 a89$
4 a7idai8
5 abcd
6 aBdC
7 aBCD
8 a123
9 a1a3
10 a#@$
11 bc
12 bd
13 be
14 bf
15 bg
16 c3
17 cB
18 cC
19 cd
20 cE
21 c$
22
[root@localhost135 ~]#
如果想要查找文本中字母a后面跟随3个字符的字符串,且后面跟随的字符必须是3个字母,该怎么做呢?
这就是需要引用新的符号 “[[:alpha:]]”
在正则表达式中,“[[:alpha:]]”表示任意字母(不区分大小写),请看示例:
[root@localhost135 ~]# grep -n "a[[:alpha:]]\{3\}" regextest
5:abcd
6:aBdC
7:aBCD
[root@localhost135 ~]#
上例中,“[[:alpha:]]\{3\}”表示3个连续的任意字母,此处结合了之前的知识

如果再细化一点,后面跟随的不仅仅是3个字母,并3个字母必须是小写字母,该怎么做呢?
此时需要引出另外一个新符号“[[:lower:]]”
"[[:lower:]]"表示任意小写字母,示例如下:
[root@localhost135 ~]# grep -n "a[[:lower:]]\{3\}" regextest
5:abcd
[root@localhost135 ~]#
如果要求是大写字母呢?
可以使用“[[:upper:]]”来表示任意大写字母,请看示例:
[root@localhost135 ~]# grep -n "a[[:upper:]]\{3\}" regextest
7:aBCD
[root@localhost135 ~]#

经过以上案列,不难发现,只要我们替换[[: :]]中的单词,即可表示不同的含义,常用的符号如下:
  1. [[:alpha:]] 表示任意字母(不区分大小写)------------等同于[a-zA-Z]
  2. [[:lower:]] 表示任意小写字母 --------------------------等同于[a-z]
  3. [[:upper:]] 表示任意大写字母 --------------------------等同于[A-Z]
  4. [[:digit:]] 表示任意单个数字(0到9之间)-------------等同于[0-9]
  5. [[:alnum:]] 表示任意数字或字母
  6. [[:space:]] 表示任意空白字符,包括空格 tab键等
  7. [[:punct:]] 表示任意标点符号
以上等同于的示例如下:
[root@localhost135 ~]# grep -n "a[a-zA-Z]\{3\}" regextest
5:abcd
6:aBdC
7:aBCD
[root@localhost135 ~]# grep -n "a[a-z]\{3\}" regextest
5:abcd
[root@localhost135 ~]# grep -n "a[A-Z]\{3\}" regextest
7:aBCD
[root@localhost135 ~]# grep -n "a[0-9]\{3\}" regextest
8:a123
[root@localhost135 ~]#

我们可以发现[[:alpha:]] 表示任意字母(不区分大小写)等同于[a-zA-Z],但是[[:alpha:]] 是由两个方括号组成,[a-zA-Z]只有一个方括号,那么[ ]在正则中代表什么意思呢?
“[ ]”表示匹配指定范围内的任意单个字符,请看示例:
[root@localhost135 ~]# grep -n "b[ceg]" regextest
5:abcd
11:bc
13:be
15:bg
[root@localhost135 ~]#
可以看到,只要字母b后跟随有 c/e/g中的任意一个,都可以被匹配到,这也就是[ ] 的含义,匹配指定范围内的任意单个字符,换句话说,就是字符与方括号[ ]内的任意一个字符相同,就可以被匹配到。再看如下示例:
[root@localhost135 ~]# grep -n "c[Bd3$]" regextest
5:abcd
16:c3
17:cB
19:cd
21:c$
[root@localhost135 ~]#

此时我们应该就可以理解[[:alpha:]]的构造
第一部分:最外层 [ ],表示匹配指定范围内的任意单个字符
第二部分:最内层[:alpha:],表是不区分大小写的字母
两部分结合,就是表示匹配任意单个字母(不区分大小写),其他的符号则类似。

我们已经理解了[ ]的含义,再来认识一个新的 [^ ]
[^ ]表示匹配指定范围的任意单个字符,与[ ]的含义相反,也就是取反
[ ]表示匹配指定范围的任意单个字符
请看如下示例:
[root@localhost135 ~]# grep -n "c[^3BCd]" regextest
20:cE
21:c$
[root@localhost135 ~]#

既然[^ ]表示取反,那我们可以举一反三
  1. [^0-9] 表示匹配单个非数字字符 ------------------------------------------等同于[^[:digit:]]
  2. [^a-z] 表示非小写字母的单个字符可以匹配到 ---------------------------等同于[^[:lower:]]
  3. [^A-Z] 表示非大写字母的单个字符可以匹配到 ---------------------------等同于[^[:upper:]]
  4. [^a-zA-Z] 表示非字母的单个字符可以匹配到,比如数字和符号 ---------等同于[^[:alpha:]]
  5. [^a-zA-Z0-9] 表示非字母、非数字的单个字符可以匹配到,比如符号 ---等同于[^[:alnum:]]
此外,还有一些简写格式的符号,如果grep不能识别这些简写格式,则可以使用 -P 选项,表示grep使用兼容per的正则表达式引擎,示例如下:
[root@localhost135 ~]# grep -n "c\d" regextest -P
16:c3
[root@localhost135 ~]#
可以看出 \d 表示任意单个0到9 的数字,另外还有一些简写,罗列如下:

  1. \d 表示任意单个0到9的数字
  2. \D 表示任意单个非数字字符
  3. \s 表示匹配单子空白字符,包括 空格 tab键
  4. \S 表示匹配单个非空白字符
  5. \t 表示匹配单个横向制表符 相当于一个tab键

评论列表