正则技术1 --- 正则表达式

2022年01月14日 阅读数:2
这篇文章主要向大家介绍正则技术1 --- 正则表达式,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

1、基本概述
用户要在某个数据集中匹配并抽取一些特殊或关键数据可使用正则表达式技术, 主要用途就是模式匹配, 比系统提供的str标准字符串处理函数功能强大而且效率更高 , 由于str系列函数采用ASCII码逐字符偏移比较的形式查找修改字符数据,可是REGEX正则采用贪心算法进行匹配查询。
2、正则语句格式
正则语句是由一组匹配字符+特殊符号(元字符)构成的字符串 ,该字符串用于描述要匹配数据的数据规则, 最后根据正则语句进行模式匹配,获取关键内容。
3、数据规则
正则表达式是批量匹配与提取技术, 使用者必须先观察数据集,分析数据规则与数据特征,然后根据数据特征编辑出相应的正则语句(匹配字符串) , 若是要匹配的数据没有特定模式或规则, 那么正则表达式不可用。
示例:web

DataFile_01:
<GameName>BUG</Gamename>
<Price>99</Price>
<GameName>吃鸡</Gamename>
<Price>189</Price>
<GameName>LOL</Gamename>
<Price>98</Price> //该数据集全部数据都有特定规则,可使用正则表达式匹配获取特定数据
DataFile_02:
吃饭、213、喝奶茶2077299、睡觉、1987、学习、232132
//该数据集中没有明确数据规则,不太适合使用正则表达式

例如要匹配DataFile_01 数据集中全部的游戏名 (这个如今可能看不懂,看完后面就懂啦)正则表达式

<GanmeName>游戏名</GameName> //文件中的数据规则
使用正则语句模拟这个数据规则:
<GameName>[^<]+?</GameName> //根据规则编写正则语句

4、模式匹配过程
一、观察数据集,分析出兴趣数据的规则与模式。
二、根据兴趣数据的规则编辑出相应的正则语句,使用grep命令或regex正则函数进行模式匹配。
三、将数据集以行为单位拷贝到REGEX模式空间。
四、贪心算法,模式匹配正则语句。以函数方式抽取保存兴趣数据,以命令方式找到数据会直接打印。
遍历整个文件,拷贝全部行到模式空间。用正则语句匹配筛选一遍,文件遍历查找结束后退出。
5、Linux 操做系统中只有三个命令使用正则技术
一、grep (咱们主要介绍grep):使用正则语句进行模式匹配,查找数据。算法

grep --help  //查看全部命令支持的opt选项
grep  -opt  '正则语句'  file

将file数据以行为单位拷贝到模式空间用正则语句进行模式匹配。
在这里插入图片描述
二、awk:awk可使用域分割,经过awk语法对特定数据进行格式化与提取。
三、sed:文件流处理,批处理文件比较方便,特别适合对多文件中相同的内容进行统计修改。
上述三个命令使用特殊符号都是正则元字符(正则技术) ,其余命令使用特殊符号皆为通配符。svg

#某些正则表达式元字符与系统通配符一致 , 可是意义不一样
grep 'a*' DataFile #正则语句中使用的 * 为元字符
ls -l *.c #ls命令使用的*为通配符

6、元字符介绍
一、\ 转义符
二、*默认之前一个字符为参照,表示该字符出现0次或屡次。
三、+默认之前一个字符为参照,表示该字符出现1次或屡次 <须要转义>。
四、 .能够表示任意字符1次。
例一:
在这里插入图片描述函数

a出现0次或者屡次,那就是 e-mail 文件中全部行都会出现 (空行也会出现)。a绝对匹配,会高亮显示。学习

例二:必须有最少一个a
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述测试

'aa*''a+'是一回事 可是'a'与他们等价吗?虽然命令输出显示的结果是同样的,可是实际上就这三条数据来讲:spa

aasa
as
aaasa

对于'aa*''a+'是3个结果,由于他们查找的在这行中是之前一个字符为参照,出现一次或屡次,以行为单位是一个总体的结果。 aasa,'aa*' 有一个a固定了,而后接下来a出现0次或者屡次,aasa就是一个结果,已经找到咱们想要的了,这行就是一个总体。而'a' 是一共有3+1+4个结果,每次在这行中寻找a,找到了是一个结果,又找到了又是一个结果,'a'以a为单位进行匹配,有一个a就算一个。操作系统

grep 'nmk*' e-mail  //表示k出现0次或者屡次
grep '\(nmk\)*' e-mail  //表示nmk出现0次或者屡次 

五、? 之前一个字符为参照,表示参照字符出现0次或1次 <须要转义>
默认状况下正则为贪婪模式匹配,能够经过?切换为非贪婪模式。
贪婪模式语句: .* 或 .+
非贪婪模式语句: .*? 或 .+?
贪婪模式:尽量多的匹配。
非贪婪模式:匹配到一个结果当即返回,尽量少的匹配。code

<div>TEST01</div><div>TEST02</div>
使用贪婪模式匹配:<div>.*</div>
结果:<div>TEST01</div><div>TEST02</div>
使用非贪婪模式匹配:<div>.*?</div>
结果:<div>TEST01</div>

六、[^] 默认之后一个字符为参照,表示这行以该字符为行首字符。
七、[$] 默认之前一个字符为参照,表示这行以该字符为行末字符。

grep '^h' e-mail  //以h开头的行
grep 'o$' e-mail  //以o结尾的行
grep '^h.*o$' e-mail  //以h开头o结尾的行

例三:
在这里插入图片描述
注意:默认状况下正则符号没法相互参照 例如'^*$'^向后参照发现是元字符* 不能参照,参照空,*向前参照发现是元字符^不能参照,参照空,$同理,什么也匹配不出来。匹配数据跟元字符一致须要加转义\。写的东西若是前面没有参照,好比只是单纯的'+' 。grep命令能够简单识别出来,没有参照物,那你可能就是想简单的匹配'+'

八、若是须要匹配空行,可使用^$。
例四:
在这里插入图片描述
九、[xyz] 表示字符集合,使用字符集合时,可能表示集合中任意一个元素,仅表示一个字符(表示x/y/z,一次表明其中的一个)。
1)[a-z] 表示小写字符集合。
2)[A-Z] 表示大写字符集合。
3)[0-9] 表示数字集合。
4)[^A-Z] ^向后参照表示集合取非,该语句表示全部非大写字符的任意一个字符。
例五:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述十、| 逻辑或符号,在集合中能够直接使用,其余位置使用须要转义<须要转义>。
十一、
1){n} 之前一个字符为参照,表示该字符连续出现n次 <须要转义>。
2){n,} 之前一个字符为参照,表示该字符最小连续出现n次,最大连续出现屡次。
3){n,m} 之前一个字符为参照,表示该字符最小连续出现n次,最多连续出现m次。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
匹配时从m到n进行筛选匹配
grep 'a\{2,5\}' e-mail 先匹配5个a 不够再匹配4个 而后3个 … …
十一、()
能够用()选中,生成一条完整的正则语句 , 若是使用regex正则函数,()能够表示子表达式 <须要转义>

#()用法
#匹配数据中的词: description、business、hot , 以这三个词中任意一个为行首的行
grep '^\(description \| business \| hot\)' FILE
grep '\(world\)*' FILE   //world出现0次或屡次

练习:在phone测试数据中匹配全部正确的手机号码。
手机号码规则分析:
1)数据集中的手机号码,行首与行尾都是数字构成。
2) 手机号码由11位数字构成。
3)手机号首位必须为1。
4)手机号段[3-8]之间的任意数构成。(第二位)
5) 后9位为[0-9]任意数构成。
在这里插入图片描述

在这里插入图片描述