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

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

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> //根据规则编写正则语句

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

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

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

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

六、元字符介绍
1、\ 转义符
2、*默认以前一个字符为参照,表示该字符出现0次或多次。
3、+默认以前一个字符为参照,表示该字符出现1次或多次 <需要转义>。
4、 .可以表示任意字符1次。
例一:
在这里插入图片描述

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

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

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

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次或者多次 

5、? 以前一个字符为参照,表示参照字符出现0次或1次 <需要转义>
默认情况下正则为贪婪模式匹配,可以通过?切换为非贪婪模式。
贪婪模式语句: .* 或 .+
非贪婪模式语句: .*? 或 .+?
贪婪模式:尽可能多的匹配。
非贪婪模式:匹配到一个结果立即返回,尽可能少的匹配。

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

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

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

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

8、如果需要匹配空行,可以使用^$。
例四:
在这里插入图片描述
9、[xyz] 表示字符集合,使用字符集合时,可能表示集合中任意一个元素,仅表示一个字符(表示x/y/z,一次代表其中的一个)。
1)[a-z] 表示小写字符集合。
2)[A-Z] 表示大写字符集合。
3)[0-9] 表示数字集合。
4)[^A-Z] ^向后参照表示集合取非,该语句表示所有非大写字符的任意一个字符。
例五:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述10、| 逻辑或符号,在集合中可以直接使用,其他位置使用需要转义<需要转义>。
11、
1){n} 以前一个字符为参照,表示该字符连续出现n次 <需要转义>。
2){n,} 以前一个字符为参照,表示该字符最小连续出现n次,最大连续出现多次。
3){n,m} 以前一个字符为参照,表示该字符最小连续出现n次,最多连续出现m次。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
匹配时从m到n进行筛选匹配
grep 'a\{2,5\}' e-mail 先匹配5个a 不够再匹配4个 然后3个 … …
11、()
可以用()选中,生成一条完整的正则语句 , 如果使用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]任意数构成。
在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值