一.正则表达式介绍
正则表达式(Regular Expression)是一种用于描述字符串模式的工具。它可以帮助你在文本中进行搜索、匹配、替换和验证操作。正则表达式由普通字符(如字母、数字和标点符号)以及元字符(具有特殊含义的字符)组成。
以下是一些常见的正则表达式元字符:
1.普通字符
代表自身的字符,例如字母和数字等。
2.元字符
1. .
:匹配除换行符 \n
之外的任意单个字符。
2. ^:匹配输入字符串的开始位置。
3. $
:匹配输入字符串的结尾位置。
4. \b
:匹配单词的边界,即单词字符和非单词字符之间的位置。
5. \d
:匹配一个数字字符,相当于 [0-9]
。
6. \D
:匹配一个非数字字符,相当于 [^0-9]
。
7. \w
:匹配一个单词字符,包括字母、数字和下划线,相当于 [a-zA-Z0-9_]
。
8. \W
:匹配一个非单词字符,相当于 [^a-zA-Z0-9_]
。
9. \s
:匹配一个空白字符,包括空格、制表符、换行符等。
10.\S
:匹配一个非空白字符。
11.[...]
:字符类,匹配方括号中列举的任意一个字符。
12.[^...]
:否定字符类,匹配除了方括号中列举的字符之外的任意一个字符。
13. *
:匹配前面的元素零次或多次。
14. +
:匹配前面的元素一次或多次。
15. ?
:匹配前面的元素零次或一次。
16. {n}
:匹配前面的元素恰好 n 次。
17. {n,}
:匹配前面的元素至少 n 次。
18. {n,m}
:匹配前面的元素至少 n 次,但不超过 m 次。
示例:
(1)过滤以c开头的行
(2)过滤出以x结尾的行
(3)* 代表匹配前面的元素零次或多次
(4)[^ ……] 否定字符类,匹配除了方括号中列举的字符之外的任意一个字符。
3.转义字符
用于转义元字符,例如 \
。
\d
:匹配任意一个数字,等价于[0-9]
。\D
:匹配任意一个非数字字符,等价于[^0-9]
。\w
:匹配任意一个字母、数字或下划线字符,等价于[a-zA-Z0-9_]
。\W
:匹配任意一个非字母、数字或下划线字符,等价于[^a-zA-Z0-9_]
。\s
:匹配任意一个空白字符,包括空格、制表符、换行符等。\S
:匹配任意一个非空白字符。
正则表达式可以通过组合上述元字符、转义字符和特殊序列来构建复杂的模式,从而实现强大的文本处理功能。它在编程、文本编辑器、命令行工具等方面都有广泛的应用。
. 匹配任意单个字符,可以是一个汉字
[] 匹配指定范围内的任意单个字符,示例:[zhou] [0-9] [] [a-zA-Z] [[:alpha:]] [0-9a-zA-Z]= [:alnum:]
[^] 匹配指定范围外的任意单个字符,示例:[^zhou] [^a.z] [a.z]
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符 (水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
\w #匹配单词构成部分,等价于[_[:alnum:]]
\W #匹配非单词构成部分,等价于[^_[:alnum:]]
\S #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意Unicode 正则表达式会匹配全角空格符
示例:
4.表示次数
* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* #任意长度的任意字符 不包括0次
\? #匹配其前面的字符出现0次或1次,即:可有可无
\+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} #匹配前面的字符n次
\{m,n\} #匹配前面的字符至少m次,至多n次
\{,n\} #匹配前面的字符至多n次,<=n
\{n,\} #匹配前面的字符至少n次
示例:
过滤出网卡文件中ip地址
5.位置锚定
^ #行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行 (单独一行 只有root)
^$ #空行
^[[:space:]]*$ # 空白行 tab 换行 回车
\< 或 \b #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
\> 或 \b #词尾锚定,用于单词模式的右侧
\<PATTERN\> #匹配整个单词
示例:
6.分组或其他
分组:( ) 将多个字符捆绑在一起,当作一个整体处理,如:(root)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名
方式为: \1, \2, \3, ... 分组
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
或者:“ \ | ”
示例:
7.扩展正则表达式
扩展正则表达式(Extended Regular Expressions)是一种在正则表达式中引入了更多功能和元字符的变体。在扩展正则表达式中,你可以使用一些特殊的元字符来实现更灵活的模式匹配。
以下是一些扩展正则表达式的常见元字符和功能:
+
:匹配前面的字符或子表达式一次或多次。?
:匹配前面的字符或子表达式零次或一次。()
:用于捕获匹配的子表达式,并将其存储到临时缓冲区中以供后续引用。|
:用于指定多个模式中的一个,相当于逻辑上的“或”。{}
:用于指定匹配的次数范围,例如{n}
匹配前面的字符或子表达式恰好 n 次,{n,}
匹配至少 n 次,{n,m}
匹配至少 n 次但不超过 m 次。[]
:用于定义字符类,指定一个字符集合,匹配其中的任意一个字符。\b
:匹配单词的边界。\d
、\w
、\s
:分别匹配数字、单词字符(字母、数字、下划线)和空白字符。
这些元字符和功能使得扩展正则表达式更加强大,能够实现更复杂的模式匹配需求。在使用扩展正则表达式时,通常需要在匹配模式前添加特殊字符 egrep
或者使用 grep -E
来启用扩展功能。
示例:
(1)+:匹配前面的字符或子表达式一次或多次。(扩展正则grep需要使用-E)
(2)()
:用于捕获匹配的子表达式,并将其存储到临时缓冲区中以供后续引用。
(3)?
:匹配前面的字符或子表达式零次或一次。