概念
· 正则表达式是用于描述一组字符串特征的模式,用来匹配特定的字符串。通过特殊字符+普通字符来进行模式描述,从而达到文本匹配的目的
· 正则表达式目前被集成到了各种文本编辑器/文本处理工具当中
应用场景
· 验证:表单提交时,进行用户名密码验证
· 查找:从大量信息中快速提取指定内容
· 替换:将指定格式的文本,进行正则匹配查找,找到之后进行特定替换
基本要素
· 字符类
· 数量限定符
· 位置限定符
· 特殊符号
正则表达式基本是与语言无关的,我们通常使用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.非零的正整数