一、基本正则表达式

关于正则表达式的内容挺多的,掌握好下文中提及的内容就能满足正常工作中的需要,如果是专门做正则编程的,可以去买本正则表达式的书籍来看好了^_^。只有多动手多练习,才是学开发编程的最好姿势。

1. 符号"."

匹配任意一个字符,除了换行符,但是需要注意的是,在sed中不能匹配换行符,但是在awk中可以匹配换行符。类似shell通配符中的"?",匹配一个任意字符。

2. 符号"*"

1
"*"表示前边字符有0个或多个。".*"表示任意一个字符有0个或多个,也就是能匹配任意的字符。类似shell通配符中的"*",可以匹配任意字符。

3. 符号"[]"

1
2
3
4
5
6
7
8
9
"[ ]"中括号中可以包含表示字符集的表达式。使用方法大概有如下几种。
[a-z]:表示a-z字符中的一个,也就是小写字母。
[0-9]:表示0-9字符中的一个,也就是表示数字。
[A-Z]:表示大写字母。
[a-zA-Z]:表示字符集为小写字母或者大写字母。
[a-zA-Z0-9]:表示普通字符,包括大小写字母和数字。
[abc]:表示字符a或者字符b或者字符c。
[^0-9]:表示非数字类型的字符,^表示取反意思,只能放在中括号的开始处才有意义。
[-cz]:表示字符-或者字符c或者字符z,注意与[c-z]的区别,因为-符号没有放在e和f之间。

4. 符号"^"

1
2
3
"^"表示行首的意思,也就是每一行的开始位置。在这里并不是上边字符范围中取反的意思,^符号只有在"[]"符号的开头处才能表示字符取反。
^abc:表示以abc开头的字符串abc
^abc.*:表示以abc开头的字符串abcxxx。

5. 符号"$"

1
2
3
"$"表示行尾的意思,也就是每一行的结尾位置,很好理解,和"^"正好相反。
world$:表示以world结尾的字符串world,如果该行中间有world字符串是不符合匹配条件的。
^$:表示空行。行首和行尾没有内容,可不就是空行嘛。

6. 符号""

1
"\"表示是转义字符,和其它语言中用到的转义字符意义基本上是一样的。其实简单理解,就是把元字符转义为普通字符,比如"\\"表示普通符号"\",把普通字符转换为特殊意义符号,比如"\n"表示把普通字符n转义为换行符。

7. 符号"{}"

1
2
3
4
5
"{}"表示前边字符的数量范围,大概有三种用法,其实容易理解,看例子就知道了,但是必须注意要加上转义字符"\",否则不生效,表示为普通字符"{"或"}"。

\{2\}:表示前边字符的重复次数是2。
\{2,\}:表示前边字符的重复次数至少是2,也就是大于等于2。
\{2,9\}:表示前边字符的重复次数大于2但小于9。

8. 符号" \ < " 和 " \ > "

1
2
3
4
5
"\<"表示匹配条件为词首的位置,理解上可以对比 "^" 行首。

举个例子,"nihao 1hello 2hello3 hello4"有这么内容的一行内容。
"\< hello"匹配结果"nihao 1hello 2hello3 hello4"
"hello\>"匹配结果"nihao 1hello 2hello3 hello4",这种匹配方式用的不是太多,用到会用就OK。

二、扩展正则表达式

1
扩展正则表达式是在基本正则表达式中扩展出来的,内容不是很多,使用频率上可能没有基本正则表达式那么高,但是扩展正则依然很重要,很多情况下没有扩展正则是搞不定的。sed命令使用扩展正则需要加上选项-r。

1. 符号"?"

1
"?":表示前置字符有0个或1个。

2. 符号"+"

1
"+":表示前置字符有1个或多个。

3. 符号" | "

1
2
"|":表示指明两项之间的一个选择。
abc|ABC:表示可以匹配abc或者ABC。

4. 符号"()"

1
2
3
"()"表示分组,类似算数表达式中的()。子命令表达式中可以通过\1,\2,\3等来表示分组匹配到的内容。其实"()"也可以在基本正则表达式中使用的。
(a|b)b:表示可以匹配ab或者bb字串
([0-9])|([0][0-9])|([1][0-9]):表示匹配0-9或者00-09或者10-19范围的字符。

5. 符号"{}"

1
这里的"{}"和基本正则表达式中的大括号意义是一样的,只不过在使用时不用加"\"转义符号。

三、正则表达式的分类和应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
字符类
[Ww]hat \.H[12345]

字符的范围
[a-z] [0-9] [Cc]hapter[1-9] [-+*/] [0-1][0-9][-/][0-3][0-9][-/][0-9][0-9]

排除字符类
[^0-9]

重复出现的字符
[15]0* [15]00

字符的跨度
*与\{n,m\}

电话号码的匹配
[0-9]\{3\}-[0-9]\{7,8\}

分组操作
compan(y|ies)