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

正则表达式Regular Expression

程序员文章站 2022-03-23 20:40:01
正则表达式(Regular Expression) 一、起源 ??正则表达式这个名词,相信很多人都听说过,这个名词最早起源于1956 年, 一位叫 Stephen Kleene 的美国数学...

正则表达式(Regular Expression)

一、起源

??正则表达式这个名词,相信很多人都听说过,这个名词最早起源于1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。

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

??之后一段时间,人们发现可以将这一工作成果应用于其他方面,正则的应用越来越广泛,功能也非常的强大。

二、正则表达式是什么?

??正则表达式,又称规则表达式。(英语:RegularExpression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。——百度百科

??这句话可能术语太多不太好理解,比如我们都知道淘金,通过不同筛子经过多次过滤环节才能筛到最终的金子,这里的正则就是如此,通过不同筛选最重得到我们最终期待的。

??到了这里我们会很好奇既然它可以找到我们想要的条件自动返回结果,那么我们又怎么使用它呢?后面在文本编辑器着重介绍。

三、两类基本正则表达式

1、基本正则表达式:BRE
?grep,egrep -G
2、扩展正则表达式:ERE
?grep -E, egrep

四、正则表达式元字符

字符匹配

. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即A-Z, a-z
[:lower:] 小写字母[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:]水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
匹配次数
用在指定次数的字符后面,用于指定前面的字符要出现的次数#*

* 匹配前面的字符任意次,包括0次
贪婪模式:尽可能长的匹配
.*任意长度的任意字符
\?匹配其前面的字符0或1次
\+匹配其前面的字符至少1次
\{n\}匹配前面的字符n次
\{m,n\}匹配前面的字符至少m次,之多n次
\{,n}匹配前面的字符至多n次
\{n,\}匹配前面的字符至少n次
位置锚定
定位出现的位置
^行首锚定,用于模式的最左侧
$行尾锚定,用于模式的最右侧
^PATTERN$  用于模式匹配整行
^$  空行
^[[:space:]]*$    空白行
\<  或  \b  词首锚定,用于单词模式的左侧
\> 或   \b  词尾锚定,用于单词模式的右侧
    -》注意:在grep中,字母和数字的组合也被视为单词
\ 匹配整个单词
分组
1、分组:\(\)将一个或多个字符绑定在一起,当作一个整体进行处理,如:\(root\)\+
2、分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3............
    \1  表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
    \2:模式从左侧起,第二个左括号以及与其匹配的右括号之间的内容
3、后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
   或者:\|

五、 Linux上文本三剑客

grep:文本过滤(模式:pattern)工具
sed:stream editor,文本编辑器
awk:Linux上实际是gawk(GUN awk),文本报告生成器

??这里有句心里话,这里文本编辑命令非常的多,面对这样的现实就必须得对常用的命令牢记,总结一句话搬砖活累一点,回报一定是有的!!!

grep

作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查,打印匹配到的行。
功能:它最重要的功能就是进行字符串数据的对比,然后将符合用户需求的字符打印出来。
过程:grep在数据中查找一个字符串时,是以整行为单位来进行数据的选取的。
模式:由正则表达式字符及文本字符所编写的过滤条件。
grep [OPTIONS] PATTERN [FILE…] 无符号和有符号的执行区别
grep root /etc/passwd
grep "$USER" /etc/passwd
grep '$USER' /etc/passwd
grep `whoami` /etc/passwd

注意这里不是单引号’还是强引用`,注意符号

grep命令选项:

--color=auto 关键字高亮显示
    -v 反向搜索
    -i 忽略大小写
    -n 显示行号
    -c 不显示搜索结果,仅显示匹配的行数
    -o 仅显示匹配到的字符串
    -q 静默输出
    -A 显示搜索行及其向下相临的#行
    -B 显示搜索行及其向上相临的#行
    -C 显示搜索行及其向上和向下相临的#行
    -e char1 -e char2 [-e charN] 多个选项间or关系
    -w 匹配整个单词
    -E 或egrep 支持扩展正则表达式
    -F 或fgrep 不支持正则表达式
扩展正则表达式 ?egrep
俩种操作方式
grep -E  
egrep
??为了简化命令操作,了解一些使用范围更广的扩展表达式,格式会更加整洁,思路会更加清晰
语法  egrep [options]  PATTERN  [FILE...]
扩展正则表达式的元字符 字符匹配:
. 任意单个字符
[]指定范围字符
[^]不在指定范围的字符
次数匹配:
*: 匹配前面字符任意次
?: 0或1次
+:1次或多次
{m}: 匹配m次
{m,n}:至少m次,至多n次
位置锚定:
^:行首
$:行尾
\<,\b:语首
\>,\b:语尾
分组:
()
后向引用: \1,\2,......
或者:
|

六、小试牛刀(???????)

======Stay hungry, Stay foolish======

grep –color=auto

grep --color=auto    让关键字高亮显示
默认的alias里面对grep 做了默认设置
查看一下 which  grep
这里的alias是否还有印象呢?
这个选项就能使条件高亮显示

补充知识:去别名的三种方式
/bin/grep
'grep'
\grep

grep -q 静默模式

这里的意思是让匹配出来不显示
举例:判断在/etc/group文件里如果有shuguo就
使用存在否则不存在

场景
grep -q shuguo /etc/group && echo exist || echo not exist

初认识这个命令可能不太了解它的作用,下面总结一下:根据不同的输出结果做出差异选择
,得到想要的结果

grep -[ABC] ? 显示搜索行及其向下相邻的#行

实际中的场景
nmap探测目标主机跑了哪些服务包括开了哪些端口

探测开机主机的ip
nmap  -v -sP 172.18.250.0/24 |grep -B1 "Host is up"| grep for | cut -d" " -f5

pig

grep -e [keyword] -e [keyword] filename

实现多个选项间的逻辑or关系
grep root /etc/passwd | grep bin
此命令的执行顺序是从左至右依次选择,此关系为并的关系,接上一步在进行筛选
grep -e root -e bin /etc/passwd
此命令是或的关系,上面的命令对此筛选没影响

pig

grep -w 匹配整个单词(完全匹配)

举例
 grep root /etc/passwd
 grep -w root /etc/passwd

场景
netstat -tulnap > net.txt
对端口修改为80,8080
筛选条件端口80会出现二个结果此时完整匹配就能得到想要的结果
pic

扩展正则

相比于正则区别在于有些命令减少了\
使用
   grep -E "root|bin" /etc/passwd
   egrep  " root|bin" /etc/passwd

匹配次数

这里主要注意在对匹配次数,做上限限制会出现多次也能满足情况这里主要是匹配时做了分割,时匹配时满足了条件。

pic
分组:\(\)
一
错误示范: grep -o "[ab]\+" test  
输出:只要字符包含ab就输出
正确示范:grep -o "\(ab\)\+" test
二
grep -o "(ab\)\{2,\}  test   
注意这里不能认为就是ab两次或以上而是同行包含abab

\1 开头和结束字母要相同

首先得对文件设置特定环境test.txt
要求显示开头结尾相同的内容
cat test.txt
ababsfdfsfsaabb
aabbdfsfsfdffsaffb
adfbdfwebggadffb

错误示范
grep "\(a..b\).*\(r..t\)$" test.txt
正确示范
grep "(\r..t).*\1$" test.txt

七 总结

??正则这里算是介绍到这了但是只是这点还是不足够的,命令太多没什么可偷懒的。