欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

正则表达式

程序员文章站 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