正则表达式

正则表达式

1 什么是正则表达式

正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单的说,正则表达式就是用在字符串的处理上面的一项表示式。由于正则表达式语法简练,功能强大,得到了许多
程序设计语言的支持,包括Java、C++、Perl以及Shell等。

2 为什么使用正则表达式

在进行程序设计的过程中,用户会不可避免地遇到处理某些文本的情况。有的时候,用户还需要查找符合某些比较复杂规则的字符串。对于这些情况,如果单纯依靠程序设计语言本身,则往往会使得用户通过复杂的代码来实现。但是,如果使用正则表达式,则会以非常简短的代码来完成。

3 如何学习正则表达式

  • 重点在于理解元字符
  • 掌握好正则表达式的语法
  • 开拓思路,寻找最佳的表达方法

4 如何使用正则表达式

当一个正则表达式完成之后,并能够保证这个表达式一定是准确的,需要不断地测试才可以确定其正确与否。在不同的环境下,用户需要不同的工具来帮助他完成测试的过程。如果是在Shell命令行中,用户可以使用grep命令来测试。
grep家族有三大成员分别为:

  • grep:支持使用基本正则表达式。
  • egrep:支持使用扩展正则表达式。
  • fgrep:不支持使用正则表达式,即所有的正则表达式中的元字符都将作为一般字符,仅仅拥有其字面意义,不再拥有特殊意义。

grep命令的名称来自于全局搜索正则表达式并打印文本行(Global Search Regular Expression andPrint out the line)的缩写。它是一个非常古老的UNIX命令,也是一种强大的文本搜索工具。
grep命令使用正则表达式来搜索文本,并且把匹配的文本行打印出来。

grep命令根据用户指定的”pattern(过滤条件)“对目标文本逐行进行匹配检查;打印出符合条件的行,即文本搜索工具。注:PATTERN即过滤条件指由文本字符及正则表达式元字符所编写的字符串。
grep命令的基本语法如下:

grep [options] pattern [file…]

在上面的语法中,options表示选项,选项列表如下表。pattern表示要匹配的模式,file表示一系列的文件名。grep命令会从一个或者多个文件中搜索满足指定模式的文本行,并且打印出来。模式后面的所有的字符串参数都被看作是文件名。

-n :显示行号 
-o :只显示匹配的内容 
-q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容 -l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc 
-A :如果匹配成功,则将匹配行及其后n行一起打印出来
-B :如果匹配成功,则将匹配行及其前n行一起打印出来
-C :如果匹配成功,则将匹配行及其前后n行一起打印出来 
--color:高亮颜色显示匹配到的字符串 
-c :如果匹配成功,则将匹配到的行数打印出来 
-E :等于egrep,扩展 
-i :忽略大小写 
-v :取反,不匹配 
-w:匹配单词 
-r:递归搜索,不仅搜索当前目录,还要搜索其各级子目录 
-s:不显示关于不存在或者无法读取文件的错误信息

5 基本正则表达式

基本正则表达式(Basic Regular Expression,BRE),又称为标准正则表达式,是最早制订的正则表达式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之一,另外一种语法标准称为扩展正则表达式。

字符含义
^在每行的开始进行匹配
$在每行的末尾进行匹配
.对任何单个字符进行匹配
*对前一项进行0次或多次重复匹配
[str]对str中的任何单个字符进行匹配
[^str]对任何不在str中的单个字符进行匹配
[a-b]对a到b之间的任何字符进行匹配
\忽略后面一个字符的特殊含义

示例:

1)^word 表示搜索以word开头的内容。
2)word$ 表示搜索以word结尾的内容。
3)^$ 表示空行,不是空格。 
4). 代表且只能代表一个任意字符。 
5)\ 转义字符,让有着特殊身份意义的字符失效。
 6)* 重复0个或多个前面的字符 
 7).* 匹配所有的字符。^.* 任意多个字符开头。 
 8)[] 匹配字符集合内任意一个字符,如[a-z] 
 9)[^abc] ^在中括号里表示非,不包含a或b或c 
 10){n,m} 匹配n到m次,前一个字符。 {n,} 至少N次,多了不限。 {n} n次 {,m} 至多m次,少了不限。 注意:grep要将{}转义,\{\},egrep不需要转义 
 11)\(\),定义子表达式的开始和结束位置。例如,正则表达式“\(love\).*\1”表示匹配2个“love”中间 包含任意个字符的文本行,其中“\1”表示引用前面的“love” 
 12)\<或\b:锚定词首(支持vi和grep),其后面的任意字符必须作为单词首部出现,如 \<love或\blove 
 13)\>或\b:锚定词尾(支持vi和grep),其前面的任意字符必须作为单词尾部出现,如 love\>或love\b

正则表达式字符集

字符说明
[[:alnum:]]匹配任意一个字母或者数字,等价于[A-Za-z0-9]
[[:alpha:]]匹配任意一个字母,等价于[A-Za-z]
[[:digit:]]匹配任意一个数字,等价于0-9
[[:lower:]]匹配任意一个小写字母,等价于a-z
[[:upper:]]匹配任意一个大写字母,等价于A-Z
[[:space:]]匹配任意一个空白符,包括空格、制表符、换行符以及分页符
[[:blank:]]匹配空格和制表符
[[:graph:]]匹配任意一个看得见的可打印字符,不包括空白字符
[[:print:]]匹配任何一个可以打印的字符,包括空白字符,但是不包括控制字符、字符串结束符‘\0’、EOF文件结束符(-1)
[[:cntrl:]]匹配任何一个控制字符,即ASCII字符集中的前32个字符。例如换行符、制表符等
[[:punct:]]匹配任何一个标点符号,例如“[]”、“{}”或者“,”等
[[:xdigit:]]匹配十六进制数字,即0-9、a-f以及A-F

6 扩展正则表达式

扩展正则表达式(Extended Regular Expression,ERE)支持比基本正则表达式更多的元字符,但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持。前面介绍的元字符“^”、“$”、“.”、“*”、
“[]”以及“[^]”这6个元字符在扩展正则表达式都得到了支持,并且其意义和用法都完全相同,不再重复介绍。接下来重点介绍一下在扩展正则表达式中新增加的一些元字符。

字符含义
+对前一项进行1次或多次重复匹配
对前一项进行0次或1次重复匹配
{j}对前一项进行j次重复匹配
{j,}对前一项进行j次或更多次重复匹配
{,k}对前一项最多进行k次重复匹配
(st) 匹配s项或t项中的一项

练习

1.04101802001-04101802043正则表达式匹配

分析:04101802001-04101802043,发现041018020位没有发生改变都是以这个开头;01-43,其中又划分为01-09,10-39,40-43。长度也是固定的。

(^041018020([0][1-9]|[1-3][0-9]|[4][0-3])$)

验证

 # 验证正确的学号04101802034能否匹配
[redhat@localhost day6]$ echo '04101802034' | egrep '(^041018020([0][1-9]|[1-3][0-9]|[4][0-3])$)'
04101802034   
#分别验证学号04101802044能否匹配,少了一位或者多一位,是否正确
[redhat@localhost day6]$ echo '04101802044' | egrep '(^041018020([0][1-9]|[1-3][0-9]|[4][0-3])$)'
[redhat@localhost day6]$ echo '0410180204' | egrep '(^041018020([0][1-9]|[1-3][0-9]|[4][0-3])$)'
[redhat@localhost day6]$ echo '0410180200' | egrep '(^041018020([0][1-9]|[1-3][0-9]|[4][0-3])$)'
[redhat@localhost day6]$ echo '041018020222' | egrep '(^041018020([0][1-9]|[1-3][0-9]|[4][0-3])$)'

2.ipv4地址,邮箱地址,8位强密码,url正则表达式

ipv4
分析:ipv4 是由三个.分开的1-255的范围
先把1-255通过正则表达式表达,分为200-255,10-199,1-9
((2(5[0-5]|[0-4][0-9]))|([1]?[0-9][0-9])|([1-9]))
后面三节的格式一样可以进行重复三次.255,就第一节加上一个.重复三次
正则表达

((2(5[0-5]|[0-4][0-9]))|([1]?[0-9][0-9])|([1-9]))(\.((2(5[0-5]|[0-4]\d))|([0-1]?[0-9][0-9])|([0-9]))){3}$
#进行验证,本机地址能否匹配成功
[redhat@localhost day6]$ echo '172.25.10.130' | egrep '((2(5[0-5]|[0-4][0-9]))|([1]?[0-9][0-9])|([1-9]))(\.((2(5[0-5]|[0-4]\d))|([0-1]?[0-9][0-9])|([0-9]))){3}$'
172.25.10.130
#当IP地址超出范围
[redhat@localhost day6]$ echo '172.25.10.130' | egrep '((2(5[0-5]|[0-4][0-9]))|([1]?[0-9][0-9])|([1-9]))(\.((2(5[0-5]|[0-4]\d))|([0-1]?[0-9][0-9])|([0-9]))){3}$'
172.25.10.130
[redhat@localhost day6]$ echo '172.25.10.1300' | egrep '((2(5[0-5]|[0-4][0-9]))|([1]?[0-9][0-9])|([1-9]))(\.((2(5[0-5]|[0-4]\d))|([0-1]?[0-9][0-9])|([0-9]))){3}$'

邮箱地址

(?:[a-zA-Z0-9]*)@([a-zA-Z0-9]*)\.(?:[a-z]*)

测试

[redhat@localhost day6]$ echo 'admin@163.com' | grep -oP '(?:[a-zA-Z0-9]*)@([a-zA-Z0-9]*)\.(?:[a-z]*)'
admin@163.com
[redhat@localhost day6]$ echo 'admin@qq.com' | grep -oP '(?:[a-zA-Z0-9]*)@([a-zA-Z0-9]*)\.(?:[a-z]*)'
admin@qq.com

8位强密码
八位强密码就是必须包含大小写字母和数字的组合,可以使用特殊字符,长度为8位

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8}$

测试

[redhat@localhost day6]$ echo 'Hello!ni' | grep -oP '^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8}$'
[redhat@localhost day6]$ echo 'Hello!n1' | grep -oP '^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8}$'
Hello!n1
[redhat@localhost day6]$ echo 'Hello!n12' | grep -oP '^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8}$'

url正则表达式

 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

测试

[redhat@localhost day6]$ echo 'http://www.baidu.com' | grep -oP '^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$'
http://www.baidu.com
[redhat@localhost day6]$ echo 'www.baidu.com' | grep -oP '^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$'
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值