正则表达式
程序员文章站
2022-06-01 09:14:18
...
正则表达式是用于描述一组字符串特征的模式,用来匹配特定的字符串。通过特殊字符+普通字符来进行模式描述,从而达到文本匹配的目的的工具。
应用场景
- 验证:表单提交时,进行用户名密码验证。
- 查找:从大量信息中快速提取指定内容。
- 替换:将指定格式的文本,进行正则匹配查找,找到之后进行特定替换
基本要素
- 字符类
- 数字限定符
- 位置限定符
grep是Linux下按行匹配文本的工具
- -E:使用扩展正则匹配
- --color:将匹配到的内容进行语法高亮
字符类
字符 | 含义 |
. | 匹配任意一个字符 |
[] | 匹配括号内的任一个字符 |
- | 在[]括号内表示字符范围 |
^ | 位于[]括号内的开头,匹配除括号中的字符之外的任意一个字符 |
[[ : xxx: ]] | grep工具预定的一些命名字符类 |
数字限定符
字符 | 含义 |
? |
紧跟在它前面的单元应匹配零次或一次 |
+ | 紧跟在它前面的单元应匹配一次或多次 |
* | 紧跟在它前面的单元应匹配零次或多次 |
{N} | 紧跟在它前面的单元应精确匹配N次 |
{N,} | 紧跟在它前面的单元应精确匹配至少N次 |
{,M} | 紧跟在它前面的单元应匹配最多M次 |
{N,M} |
紧跟在它前面的单元应精确匹配至少N次,最多匹配M次 |
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'l?'
hello world
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'a?'
hello world
[aaa@qq.com regular]$ echo $?
0 #匹配成功,零次或一次
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'l+'
hello world
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'a+'
[aaa@qq.com regular]$ echo $?
1 #匹配不成功,至少一次
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'l*'
hello world
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'a*'
hello world
[aaa@qq.com regular]$ echo $?
0 #匹配成功,零次或多次
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'l{3}'
[aaa@qq.com regular]$ echo $?
1 #精确匹配3次
[aaa@qq.com regular]$ echo "hello wllld" | grep -E --color 'l{3}'
hello wllld
[aaa@qq.com regular]$ echo "helllo world" | grep -E --color 'l{3,}'
helllo world
[aaa@qq.com regular]$ echo "hellllo world" | grep -E --color 'l{3,}'
hellllo world
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'l{3,}'
[aaa@qq.com regular]$ echo $?
1 #至少匹配3次
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'l{,3}'
[aaa@qq.com regular]$ echo $?
1 #最多匹配3次
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'l{1,3}'
hello world
[aaa@qq.com regular]$ echo "hellllo world" | grep -E --color 'l{1,3}'
hellllo world
[aaa@qq.com regular]$ echo "helllllo world" | grep -E --color 'l{1,3}'
helllllo world
#匹配1—3次
位置限定符
字符 | 含义 |
^ | 匹配行首的位置 |
$ | 匹配行末的位置 |
\< | 匹配单词开头的位置 |
\> | 匹配单词结尾的位置 |
\b | 匹配单词开头或结尾的位置 |
\B | 匹配非单词开头和结尾的位置 |
[aaa@qq.com regular]$ echo "hello world" | grep -E --color '^he'
hello world #行首
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'ld$'
hello world #行尾
[aaa@qq.com regular]$ echo "hello world" | grep -E --color '^$'
[aaa@qq.com regular]$ echo $?
1 #匹配空行
[aaa@qq.com regular]$ echo "hello world" | grep -E --color '\<world'
hello world #单词开头
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'world\>'
hello world #单词结尾
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'ld\>'
hello world #单词结尾
[aaa@qq.com regular]$ echo "hello world" | grep -E --color 'ld\b'
hello world
[aaa@qq.com regular]$ echo "hello world" | grep -E --color '\bwor'
hello world #单词开头户结尾
[aaa@qq.com regular]$ echo "hello world" | grep -E --color '\Bwor'
[aaa@qq.com regular]$ echo $?
1
特殊符号
字符 | 含义 |
\ | 转义字符,普通字符转义为特殊字符,特殊字符转为普通字符 |
() | 将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符 |
| | 连接两个子表达式,表示或的关系。称为析取符 |
grep工具带上-E选项,表示使用扩展正则表达式来进行匹配;否则表示使用基准正则进行匹配。
在basic规范下,有些字符?+{}|()应解释为普通字符,要表示特殊含义需要加\转义;
在Extended规范下,?+{}|()应解释应为特殊含义,要取其字面值需要加\转义。
[aaa@qq.com regular]$ echo "abcabcabcabcdef" | grep --color '\(abc\)\{3\}'
abcabcabcabcdef
常用字符集
符号 | 替换正则 | 匹配 |
\d | [0-9] | 数字字符 |
\D | [^0-9] | 非数字字符 |
\w | [a-zA-Z0-9_] | 数字字母下划线 |
\W | [^\w] | 非数字字母下划线 |
\s | [\r\t\n\f] | 表格,换行等空白区域 |
\S | [^\s] | 非空白区域 |
[aaa@qq.com regular]$ echo "aaa@qq.com#" | grep -E --color '\d'
aaa@qq.com#
[aaa@qq.com regular]$ echo "aaa@qq.com#" | grep -E --color '\D'
[aaa@qq.com regular]$ echo "aaa@qq.com#" | grep -E --color '\w'
aaa@qq.com#
[aaa@qq.com regular]$ echo "aaa@qq.com#" | grep -E --color '\W'
aaa@qq.com#
[aaa@qq.com regular]$ echo "aaa@qq.com#" | grep -E --color '\s'
[aaa@qq.com regular]$ echo "aaa@qq.com#" | grep -E --color '\S'
aaa@qq.com#
正则表达式的分类
- 基本的正则表达式:grep指令后不跟任何参数
- 扩展的正则表达式:grep指令后跟“-E”选项
- Perl的正则表达式:grep指令后跟“-P”选项
[aaa@qq.com regular]$ echo "aaa@qq.com#" | grep -P --color '\d'
aaa@qq.com#
[aaa@qq.com regular]$ echo "aaa@qq.com#" | grep -P --color '\D'
aaa@qq.com#
贪婪模式和非贪婪模式
贪婪模式:正则表达式匹配时,会尽可能多的去匹配符合条件的内容
非贪婪模式:正则表达式匹配时,一旦发现匹配符合要求,立马就匹配成功,不会在继续匹配
零宽断言
零宽断言:指定一个满足一定条件的位置
(?=exp):零宽度正预测先行断言,断言自身出现的位置的后面能匹配表达式exp
[aaa@qq.com regular]$ echo "I'm singing whule you're dancing" | grep -oP --color '\b\w+(?=ing\b)'
sing
danc
(?<=exp):零宽度正回顾后发断言,断言自身出现的位置的前面能匹配表达式exp
[aaa@qq.com regular]$ echo "reading a book" | grep -oP --color '(?<=\bre)\w+\b'
ading
(?=exp)表示匹配exp前的;(?<=exp)表示匹配exp之后的
【练习】1、查找文件中电话号码
[aaa@qq.com regular]$ cat file
aaaaaaaaaaa
bbbbbbbbbbb
ccccccccccc
a1234567890
ab543210ccc
18220586228
188229300123
[aaa@qq.com regular]$ grep -E --color '1[3578][0-9]{9}' file
18220586228
188229300123
[aaa@qq.com regular]$ grep -E --color '1[3578][0-9]{9}$' file
18220586228