相信大家都知道见过正则表达式,但什么是正则表达式嘞?
正则表达式就是用于描述一组字符串特征的模式,用来匹配特定的字符串。通过 特殊字符+普通字符来进行模式描述,从而达到文本匹配目的工具。
正则表达式目前被集成到了各种文本编辑器/文本处理工具当
正则表达式的分类:
- 基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs)
- 扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)
- Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)
注:本文采用grep工具进行验证(grep采用贪婪匹配,匹配当前行中所有的匹配内容)
grep -E: 使用扩展正则匹配
grep --color: 将匹配的到内容进行语法高亮
正则表达式的基本要素大致可以分为如下几种:
一、字符类
(1). 匹配任意一个字符
(2)[ ] 匹配括号中的任意一个字符
(3)- 在[ ]括号内表示字符范围
(4)^ 位于[ ]括号内的开头,匹配除括号中的字符之外的任意一个字符
(5)[ [ :xxx:] ] grep工具预定义的一些命名字符类
例如:[[:alpha:]]匹配一个字母;[[:digit:]]匹配一个数字
二、数量限定符
(1)? 紧跟在它前面的单元应匹配零次或一次
(2)+ 紧跟在它前面的单元应匹配一次或多次
(3)* 紧跟在它前面的单元应匹配零次或多次
(4){N} 紧跟在它前面的单元应精确匹配N次
(5){N,} 紧跟在它前面的单元应匹配至少N次
(6){,M]} 紧跟在他前面的单元应匹配最多M次
(7){N,M} 紧跟在它前面的单元应匹配至少N次,最多M次
注意点:上述的“前面的单元”指的就是“?前面的字符”;具体可见下图所示例子
三、 位置限定符
(1)^ 匹配行首的位置
(2)$ 匹配行末的位置
(3)\< 匹配单词开头的位置
(4)> 匹配单词结尾的位置
(5)\b 匹配单词开头或结尾的位置
(6)\B 匹配非单词开头和结尾的位置
四、特殊字符
(1)\ 转义字符,普通字符转义为特殊字符,特殊字符转义为普通字符
(2)( ) 将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符
(3)| 连接两个子表达式,表示或的关系
五、其它常用通用字符集及其替换
注意点:这些符号可以来简化正则表达式的填写(恰当的使用)
六、小练习
(1)手机号码
grep -E --color '^1[35789][0-9]{9}$' file
(2)非零的正整数
grep -P --color '^(\+)[1-9]\d*$|^[1-9]\d*$' file
grep -P --color '^\+?[1-9]*$' file
注意点:
grep 支持:BREs、EREs、PREs 正则表达式
grep 指令后不跟任何参数,则表示要使用 ”BREs“
grep 指令后跟 ”-E" 参数,则表示要使用 “EREs“
grep 指令后跟 “-P" 参数,则表示要使用 “PREs"
(3)非零开头的最多带两位小数的数字
grep -E --color '^[1-9][0-9]*\.[0-9]{1,2}$' file
grep -E --color '(^[1-9][0-9]*)+(.[0-9]{1,2})$?' file
(4)由数字和26个英文字母组成的字符串
grep -E --color '^[0-9a-zA-Z]+$' file
(5)腾讯QQ号(QQ号从10000开始)
假设QQ号最短5位,最长10位
grep -E --color '^[1-9][0-9]{4,9}$' file
(6)IP地址
grep -E --color '^[1-9][0-9]{1,2}/.[0-9]{1,2}{3}$' file
grep -E --color '\d+\.\d+\.\d+\.\d+' file
感觉这个写的不是很好,希望大神们能给出更好的方法,让我这个菜鸟学习学习
(7)即匹配电话号码又匹配腾讯账号
grep -E --color '^1[35789][0-9]{9}$|^[1-9][0-9]{4,9}$' file
(8)账号是否合法(字母开头,允许5-16字节,允许字母数字下划线)
grep -E --color '^[a-zA-Z][0-9a-zA-Z_)]{4,15}$' file