正则表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。
参考技术A正则表达式(Regular Expression) 正则表达式是一种字符特征的描述方式,用来在文本中匹配到用户想要的东西.
正则表达式与通配符:
1.正则表达式一般用于处理文本内容,常用命令有grep,sed,awk,vim等
通配符一般用于匹配文件名,常用命令有find,ls,cp等
2.各符号的含义不尽相同.
什么地方使用正则表达式
vim grep sed awk nginx apache mail垃圾邮件过滤。。。 perl java python 等等都使用正则
构成
1.元字符(基本元字符、扩展元字符)
2.除元字符之外的任意字符都是表示他字面意思的正则表达式
正则表达式的匹配过程
正则表达式是按照从表达式最左端第一个字符开始,左到右依次一个一个字符进行匹配.当字符串中有字符成功匹配到正则表达式中字符,则从这个位置开始尝试正则表达式中的下一个字符进行匹配,如果匹配成功则继续从这个位置开始匹配正则表达式中下一个字符;如果匹配不成功,则“回溯”到第一次匹配的字符处重新从正则表达式中第一个字符开始匹配。
特征
贪婪匹配
基本元字符
1.字符匹配
** . 任意单个字符**
** [] []内的任意单个字符**
** [ a-z] 任意单个小写字母**
** [a-zA-z] [0-9] [a-zA-z0-9]**
[^0-9]除了数字外的任意当个字符
[a-z]小写字母
[0-9]数字
[A-Z]大写字母
[a-zA-Z]所有字母
[^a-zA-Z0-9]所有符号
次数匹配
** * 匹配前面的字符重复****0次****到多次 *
****n********匹配前面的字符重复任意次数
n,m前面的字符重复n次到m次
,n 前面的字符最多重复n次
n, 前面的字符最少重复n次
** 位置匹配**
^ 行首
$ 行尾
< 词首
> 词尾
扩展元字符****Extended Metacharacters (egrep and awk)
sed -r
?? 前面的字符重复0次或1次
次数匹配意义同基本元素中的
|或着
() 分组
\\数字 引用分组的内容
前向: 在正则中引用
后向: 在其他地方引用, \\0表示引用模式中所有的内容 \\0 ⇔ &
hehello
llllo
llheo
hellhello
hellohello
编写正则表达式的3 个步骤****:
1 知道要匹配的内容以及它如何出现在文本中。
2 编写一个模式来描述要匹配的内容
3 测试模式来查看它匹配的内容,不能错,不能漏,不能多
练习: head /etc/passwd > /tmp/pass
1. 删除每行的第一个字符
2. 在每行行首插入hello
3. 删除每行的第二个字符
4. 把每个数字用()括起来 如:(1)(2)
5. 把每个数值用()括起来 如:(12)
6. 删除每行的倒数第二个字符
7. 交换每行的第一个和最后一个字符
8. 删除刚好三个字符的单词
9. 把ro或da替换成A
思考:
1. 删除每行的第一个单词(纯字母)
2. 交换第一个和倒数第二个单词(纯字母)
POSIX字符类
点击这里点击这里
[:digit:]任何数字
[:xdigit:]任何十六进制数字
[:alpha:]任何字母
[:lower:]任何小写字母
[:upper:]任何大写字母
[:alnum:]任何字母或数字
[:cntrl:]ASCII控制字符(ASCII 0~31 和 ASCII 127)
[:punct:]不属于[:alnum:]和[:cntrl:]的任何字符
[:blank:]空格或制表符([\\t ])
[:space:]任何空白字符,包括空格([\\f\\n\\r\\t\\v ])
[:print:]任何可打印字符
[:graph:]同[:print:],但不包括空格
正则表达式与扩展正则表达式区别
最近在学习正则表达式时,遇到了一些问题,究其原因是正则表达式与扩展正则表达式的区别没有弄清楚 正则表达式与扩展正则表达式类似,只是扩展正则表达式表达更加简单
正则表达式需要打 \ 转义字符 来表示某些字符的意思,而扩展正则表达式则不需要:
\{m} 正则表达式表示至少表示前面的字符m次 {m} egrep一样
\? 正则表达式表示前面的字符0或1次 ? egrep一样
\+ 正则表达式表示前面的字符至少一次 + egrep一样
\(\) 正则表达式表示分组 () egrep一样
\| 正则表达式表示或 | egrep一样
其中一个问题就是IP地址不知道该如何来表示
IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。
IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。
例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。
IP地址(英语:Internet Protocol Address)是一种在Internet上的给主机编址的方式,也称为网络协议地址。
常见的IP地址,分为IPv4与IPv6两大类。
IP地址编址方案:IP地址编址方案将IP地址空间划分为A、B、C、D、E五类,
其中A、B、C是基本类,D、E类作为多播和保留使用。
IPV4就是有4段数字,每一段最大不超过255。由于互联网的蓬勃发展,IP位址的需求量愈来愈大,
地址空间的不足必将妨碍互联网的进一步发展。为了扩大地址空间,拟通过IPv6重新定义地址空间。
IPv6采用128位地址长度。在IPv6的设计过程中除了一劳永逸地解决了地址短缺问题以外,
还考虑了在IPv4中解决不好的其它问题。
扩展正则表达式表示:
"\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
解释:用第一个括号里的数字表示 (个位数|十位数|以一开头的三位数|200-049|250-255)
用第二个括号表示 ((数字).引用)
后面的打括号表示引用次数 为3 x(xx).x(xx).x(xx).
最后一个括号表示 x(xx)
总的命令结果表示 x(xx).x(xx).x(xx).x(xx)
注:四个xxx的范围已经限定
实例:
ifconfig | "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
inet 172.18.250.78 netmask 255.255.0.0 broadcast 172.18.255.255
inet 192.168.6.131 netmask 255.255.255.0 broadcast 192.168.6.255
inet 127.0.0.1 netmask 255.0.0.0
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章