正则表达式
正则表达式(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:],但不包括空格
正则表达式
一、基本语法
1. \d 任意数字
\w 任意字母数字下划线
\s 空格,制表符,换行符等字符
. 除了换行符任意一个字符
2. [ab5@] 表示匹配里面的任意一个字符
[^a]除a外的任意一个字符
[f-k]匹配f到k的任意一个字符
补充:特殊符号被包含在中括号中失去意义,只代表符号本身,^-除外;
标准字符集合除小数点外被包含在中括号中,自定义字符集包含该集合。
如[\d.-+] 匹配:数字小数点+-。
二、量词
\d{6} 匹配6个数字
{n,m}最少重复n次最多m次
默认贪婪模式即匹配的越多越好,加?非贪婪模式
\d{6}?
\d{6,}最少6次
?匹配0次或1次,相当于{0,1}
+ 表达式至少出现一次,相当于{1,}
* 出现任意次,相当于{0,}
三、字符边界,零宽度
^表示字符开始的位置
^i 匹配字符串开头第一个字符位置
$ 字符串结束的位置
\b 不全是\w
\A\Z分别表示文本开头和结尾
四、分支结构、捕获组、非捕获组
分支结构 | 或
捕获组 () 捕获所匹配的字符,后面跟/1、/2来取匹配的字符
非捕获组(?:)不捕获括号内匹配的字符,有利于减小内存开支。
五、零宽断言
(?=表达式) 表示后面匹配的表达式,但不包括匹配的字符串
(?<=表达式) 断言自身前面出现的表达式
(?!表达式)自身后面不能出现的表达式
(?<!表达式)断言此位置前面不能匹配的表达式
MySQL正则表达式匹配
1. 基本字符匹配: select name from user where name REGEXP '1000'; 检索name中包含文本1000的所有行。 select name from user where name REGEXP '.000'; .在正则表达式中表示匹配任意一个字符。 2. 进行OR匹配: select name from user where name REGEXP '1000|2000'; 检索name中包含文本1000或2000的所有行。 3. 匹配几个字符之一: select name from user where name REGEXP '[123] Ton'; [123]定义一组字符,它的意思是匹配1或2或3。 select name from user where name REGEXP '[1-3] Ton'; -用来定义一个范围。 4. 匹配特殊字符: 匹配特殊字符,必须用\为前导,\-表示查找-,\.表示查找. 5. 匹配多个实例: *: 0个或多个匹配; +:1个或多个匹配(等于{1,}); ?:0个或1个匹配(等于{0,1}); {n}:指定数目的匹配; {n,}:不少于指定数目的匹配; {n,m}:匹配数目的范围(m不超过255)。 6. 定位符: ^:文本的开始; $:文本的结尾; [[::]]:词的结尾; ^在集合中:用来否定该集合,例如[^0-9],表示不匹配数字