正则表达式

2022-09-26 10:18:39 浏览数 (3)

  • 正则表达式基本概述
    • 正则表达式在Linux中的分类
    • 正则表达式使用误区
    • 正则表达式使用注意事项
  • 正则表达式-修饰符(标记)
  • 正则表达式-元字符
  • 正则案例

-曾老湿, 江湖人称曾老大。


-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。


正则表达式基本概述

正则历史

正则表达式,简写:re,全拼:(regular expression) 在某些地区,管它叫做,正规表达式、规则表达式

正则表达式的"祖先"可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。

1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为"神经网事件的表示法"的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为"正则集的代数"的表达式,因此采用"正则表达式"这个术语。

随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。

如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。


为什么使用正则

主要目的: 1.方便处理文本和字符串内容 2.处理有规律的内容 3.正则一般给高级开发语言使用

例如:Python,Go,C ,JAVA等

awk 和 sed 也是一门语言

搜索和替换操作 但是一般的命令,搜索和替换缺乏灵活性,基本写死。 所以我们可以通过正则表达式,灵活的动态匹配文本。

例如: 1.可以测试输入字符串 以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。

2.替换文本。 可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。

3.基于模式匹配从字符串中提取子字符串。

4.查找文档内或输入域内特定的文本。

正则表达式在Linux中的分类

在正则表达式的语法中,主要有两个部分修饰符元字符。 修饰符,我们在后面介绍,它主要不写在正则中,要写在正则的外面。 元字符,在Linux中会把这些符号区分开,划分为基础正则扩展正则

所谓的扩展正则其实也是元字符中的一部分,只不过在linux中,有些命令不能直接使用某些元字符,需要用一些参数,才能使用。所以被一部分人称之为扩展正则

那么我们先简单介绍一下,这个分类,然后再总的来介绍所有修饰符和元字符。

基础正则:bre (basic regular expression)

代码语言:javascript复制
## 在Linux 中,有些命令支持直接写下面这些符号,所以被称为基础正则
## 比如:grep / sed / awk /高级开发语言
^
$
.
*
[]
[^]

扩展正则:ere (extended regular expression)

代码语言:javascript复制
## 然后扩展正则,需要在命令后面加一些选项
## 比如:grep -E 或者 egrep / sed -r / awk
 
|
()
{}
?

正则表达式使用误区

正则表达式 与 通配符


区别内容

正则表达式

通配符

诞生的目标

匹配字符串

匹配参数或文件

支持的命令

grep/awk/sed/shell/其他开发语言

Bash命令、DOS命令等

符号的数量

所有的元字符

* {} ? [] [^]

通配符

代码语言:javascript复制
*:匹配所有内容
例:ls -l *.txt

{}:生成序列
echo {1..10}
echo {1..100}
echo {01..100}
echo {1..10..2}
echo {a,b,c}
echo {a..z}
echo {A..Z}
echo {a..z..2}
cp /tmp/a.txt{,.bak}

?:匹配任意一个字符


# 剩下两个和正则中是一样的

正则表达式使用注意事项

  • 1.所有符号皆为英文符号
  • 2.使用三剑客时加引号
  • 3.注意字符集,如果出现字符集问题,那么将字符集修改为C(小概率事件)
  • 4.像素眼(空格,换行符,tab键)
  • 5.测试的时候,推荐使用grep -E或者egrep,因为过滤出来的内容会加颜色

正则表达式-修饰符(标记)

标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。

标记不写在正则表达式里,标记位于表达式之外,格式如下:

代码语言:javascript复制
/pattern/flags
/正则表达式/标记

下表列出了正则表达式常用的修饰符:

修饰符

含义

描述

i

ignore - 不区分大小写

将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。

g

global - 全局匹配

查找所有的匹配项

m

multi line - 多行匹配

使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾

s

特殊字符圆点 . 中包含换行符 n

默认情况下的圆点 . 是 匹配除换行符 n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 n。

正则表达式-元字符

在正则表达式中,元字符有很多很多,不仅仅是我们之间看到的那些所谓的*,.,|, ,?

测试文件

代码语言:javascript复制
I am Driverzeng .
I teach Linux.

I like sport,something on the bed,listen the music like 《Nothing on you》.
My blog is http://blog.driverzeng.com 
My download site is http://download.driverzeng.com 
or http://blog.driverzeng.com/down
My QQ is 133411023.

not 1334110023.

符号

描述

应用场景

基础正则BRE

^

以...开头

匹配以指定字符开头的内容:^zls

$

以...结尾

匹配以指定字符结尾的内容:zls$

.

匹配除换行符(n、r)之外的任何单个字符

一般该元字符不单独用,配合*一起使用

*

前一个字符连续出现0次或多次

zl* 能匹配 "z" 以及 "zll",配合.使用要注意贪婪性

[]

字符集合,匹配所包含的任意一个字符

1.'[xyz]' 可以匹配 "zls" 中的 'z'2.匹配数字[0-9]3.小写字母[a-z]4.大写字母[A-Z]5.大小写都匹配[a-z][A-z]或者[a-Z]6.在中括号中可以让特殊符号失去特殊含义7.上面的大前提是^不能放第一个

[^]

反值字符集合,匹配未包含的任意字符

1.'[^xyz]' 可以匹配 "zls" 中的 'ls'2.匹配数字和3.取出/etc/passwd第一列

将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符

n

匹配一个换行符

等价于 x0a 和 cJ

r

匹配一个回车符(回车键)

等价于 x0d 和 cM

t

匹配一个制表符(Tab键)

等价于 x09 和 cI

v

匹配一个垂直制表符

等价于 x0b 和 cK

f

换页符

等价于 x0c 和 cL

b

匹配一个单词边界,也就是指单词和空格间的位置

'erb' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'

B

匹配非单词边界

erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'

d

匹配一个数字字符

等价于[0-9]

D

匹配一个非数字字符

等价于[^0-9]

w

匹配字母、数字、下划线

等价于'[A-Za-z0-9_]'

W

匹配非字母、数字、下划线

等价于'[^A-Za-z0-9_]'

s

匹配任何空白字符,包括空格、制表符、换页符等等

等价于 [ fnrtv]

S

匹配任何非空白字符

等价于 [^ fnrtv]

扩展正则ERE

|

或者

等价于 [^ fnrtv]

前一个字符出现一次或者多次

'zl ' 能匹配 "zl" 以及 "zll",但不能匹配 "z", 等价于 {1,}

{n}

n 是一个非负整数。匹配确定的 n 次。

'o{2}' 不能匹配 "bo3" 中的 'o'但是能匹配 "foot" 中的两个 o

{n,}

n 是一个非负整数。匹配确定的 n 次。

'o{2,}' 不能匹配 "Bob" 中的 'o'但能匹配 "foooood" 中的所有 o'o{1,}' 等价于 'o ''o{0,}' 则等价于 'o*'

{n,m}

m 和 n 均为非负整数,其中n <= m,最少匹配 n 次且最多匹配 m 次

"o{1,3}" 将匹配 "fooooood" 中的前三个 o'o{0,1}' 等价于 'o?'请注意在逗号和两个数之间不能有空格

()

1.被括起来的内容看做是一个整体2.在sed命令中做后向引用

sed -nr 's#(.*)abc#1#gp'

(?=pattern)

正向肯定预查look ahead(零宽断言)

使用grep -P来使用 下面我们在Perl语言正则中使用

(?<=pattern)

反肯定预查look behind(零宽断言)

使用grep -P来使用 下面我们在Perl语言正则中使用

?

匹配前一个字符出现0次或1次

"do(es)?" 可以匹配 "do" 或 "does" 。? 等价于 {0,1}

注意:并不是所有的元字符,所有语言都支持。正则是否支持查看:请点击

代码语言:javascript复制
用户名:driverzeng
密码:wifi密码

正则案例

代码语言:javascript复制
#1.匹配身份证号
#2.匹配手机号
#3.后项引用
#4.给用户传参中间加上空格(后项引用)
echo 123456
sed -r 's#(.*)#<1>#g'
sed -r 's#(.)#<1>#g'

echo {1..10} 带空格的每个都加上<>

#5.过滤IP
#6.过滤文件中,oldboy和oldbey的内容
#7.统计上面文件的单词数量
#8.统计上面文件的字母数量
#9.取出下面的指定内容
19:09:03 up 735 days, 23:12,  2 users,  load average: 0.00, 0.03, 0.05
19:09:42 up 10:20,  3 users,  load average: 0.00, 0.02, 0.05
19:11:24 up 0 min,  1 user,  load average: 0.31, 0.08, 0.03
# 如何截取上面的登录用户数?
# 如何截取上面的开机时间?


## 因为在Linux中,我们目前只能使用awk grep sed取,而且支持的正则也是基础正则和扩展正则
## 但是有些元字符,基础和扩展正则也不支持,我们只能使用其他语言的正则,比如python
## 于是,在grep命令中,提供了一个选项叫做 -P 这个选项的作用就是,使用perl语言的正则

1 人点赞