正则表达式

概念

    · 正则表达式是用于描述一组字符串特征的模式,用来匹配特定的字符串。通过特殊字符+普通字符来进行模式描述,从而达到文本匹配的目的

    · 正则表达式目前被集成到了各种文本编辑器/文本处理工具当中

应用场景

    · 验证:表单提交时,进行用户名密码验证

    · 查找:从大量信息中快速提取指定内容

    · 替换:将指定格式的文本,进行正则匹配查找,找到之后进行特定替换

基本要素

    · 字符类

    · 数量限定符

    · 位置限定符

    · 特殊符号

正则表达式基本是与语言无关的,我们通常使用grep来进行验证:

grep是一款Linux下按行匹配文本的工具,通常是Linux下处理文本的第一步,带有很多有用的选项:

    · -E:使用扩展正则匹配

    · --color:将匹配到的内容进行语法高亮

 ·-v:把不匹配的显示出来

 ·-r/R:递归方式搜索

 ·-q:安静匹配模式(不会将匹配结果显示出来,可通过echo $?查看是否匹配成功,成功返回0,失败返回0)

 ·-i:忽略大小写

 ·-n:输出匹配行的行号

 ·-o:只输出文件中匹配到的部分

1. 字符类

 

 


显然,grep采用贪婪匹配,匹配当前行中所有的匹配内容

2. 数量限定符

 

 

由此,基本可以确定,“前面的单元”默认指的就是“?或+”前面的字符



注意:上图‘a{,3}’并未匹配成功,应该是错误或者废弃的写法

3. 位置限定符

 



“^$”在正则表达式中,确定目标串出现的位置,我们称之为“锚点”(我们之前在vim之中有类似用法)

“\b”用来限定目标串中是否有以指定字符串开头的单词,我们称之为界词,“\B”称为非界词

4. 特殊符号

 


此时,()表示将包含的内容作为一个整体(单元),进而可以用数量限定符来进行限定

目前,我们测试grep工具的时候,其中有一个-E选项,如果去掉,会有什么现象呢?


我们发现,去掉之后进行匹配,并没有正常匹配,如何理解这个现象呢?下面我们引入两个概念:

    · 基本正则表达式

    · 扩展正则表达式

区别:正则表达式的Extended规范和Basic规范基本相同,只是在Basic规范下,有些字符:?、+、{}、|、()应解释为普通字符,要表示上述特殊含义则需加\转义;反之,在Extended规范下,?、+、{}、|、()应该被理解成特殊含义,要取其字面值,也要加\转义。所以,grep工具带上-E选项,表示使用扩展正则来进行匹配,若没有,则表示使用基本正则进行匹配

于是我们就可以解决上面的问题:


如果目标字符串中本身就包含了?、+、{}、|、()这些字符,又该如何编写呢?


“|”用来级联多个条件,只要有任意一个匹配即可匹配,表示“或”的关系,称之为析取符。

其他常用通用字符集及其替换


来看以下例子:


“\d”不是表示数字字符吗?怎么会出现这种情况?

正则表达式分类:

    · 基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx,简称BREs)

    · 扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx,简称EREs)

    · Perl的正则表达式(Perl Regular Expression 又叫 Perl RegEx,简称PREs)

grep,egrep正则表达式特点

    · grep支持:BREs、EREs、PREs

    · grep指令后不跟任何参数,则表示要使用BREs

    · grep指令后跟“-E”参数,则表示要使用EREs

    · grep指令后跟“-P”参数,则表示要使用PREs

所以,要解决上述问题,必须使用-P选项:


验证其他常用字符集:




贪婪模式与非贪婪模式

贪婪模式:正则表达式去匹配时,会尽量多的匹配符合条件的内容


grep默认就是贪婪匹配

非贪婪模式:正则表达式去匹配时,会尽量少的匹配符合条件的内容,也就是说,一旦发现匹配符合要求,立马就匹配成功而不会继续匹配下去(除非有g开启下一组匹配)

练习:

1.手机号码


2.非零的正整数












 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值