小破站学习笔记
正则表达式是什么
字符模式 缩写RE
用于查找过程中匹配指定字符
许多程序设计语言都支持正则表达式进行字符串操作
正则表达式概念最初由Unix中的工具软件普及开的,如
sed grep
支持正则表达式的程序如:
locate find vim grep sed awk
正则可以干什么
匹配邮箱 匹配身份证号码 手机号 银行卡
匹配某些特定字符串 做特定处理
正则中的名词解释
- 元字符
指那些正则表达式中具有特俗意义的专用字符 如点. 星* 问号? 等 - 前导字符
位于元字符前面的一个字符 ab
c
* ao
o
.
第一类正则表达式
- 普通常用元字符
. 匹配除了换行符以外的任意单个字符* 前导字符出现0次或者连续多次.* 任意长度字符^ 行首 以..开头$ 行尾 以..结尾^$ 空行[] 匹配括号里任意单个字符或一组单个字符[^] 匹配不包含括号内任一单个字符或者一组单个字符^[] 匹配以括号里任意单个字符或一组单个字符开头^[^] 匹配不以括号里任意单个字符或一组单个字符开头################################################grep \'g.\' 1.txt匹配包含g和后所跟任意单个字符的行 (grep 行过滤)grep \'go*\' 1.txt匹配g和o0个或多个的行grep \'go.*\' 1.txt匹配go和后面任意长度字符的行grep \'^gel\' 1.txt匹配以gel开头的行grep \'abc$\' 1.txt匹配以abc结尾的行grep \'^[abc]\' 1.txt匹配以a或b或c开头的grep \'^[abc]\' 1.txt匹配不以a或b或c开头的
- 其他常用元字符
\\< 取单词的头\\> 取单词的尾\\<\\> 精确匹配\\{n\\} 匹配前导字符连续出现n次\\{n,\\} 匹配前导字符至少出现n次\\{n,m\\} 匹配前导字符出现n次与m次之间\\(\\) 保存被匹配的字符\\d 匹配数字 grep -P 要加P [0-9]\\w 匹配字母数字下划线 grep -P 要加P [a-zA-Z0-9_]\\s 匹配空格 制表符 换页符 grep -P 要加P [\\t\\r\\n]##############################################grep \'\\<hel\' 1.txt匹配里面单词以hel为头grep \'rld\\>\' 1.txt匹配里面单词以rld为尾#匹配内容里单词的头或尾 不是单词不匹配grep \'\\<hello\\>\' 1.txt精确匹配hello这个单词 注意是单词grep -w hello 1.txt 和这个精确匹配差不多grep \'go\\{2\\}\' 1.txt匹配g和前导字符o连续出现2次的grep \'go\\{2,\\}\' 1.txt匹配g和前导字符o至少出现2次grep \'go\\{2,4\\}\' 1.txt匹配g和前导字符o出现2-4次grep \'[0-9]\\{3\\}\\.[0-9]\\{3\\}\\.[0-9]\\{1\\}\\.[0-9]\\{1\\}\' 1.txt匹配ip 192.168.0.1 [0-9]表示数字 3 3 1 1 出现次数 \\. 转义.vim:%S/10.10.1.1/10.10.1.2/g:%s/\\(10.10.1\\).1/\\1.254/g:%s/helloworld yourself/hiworld myself/g:%s/hello\\(world \\)your\\(self\\)/hi\\1my\\2/g只替换掉不同的部分
- 扩展类正则常用字符
比较特殊 比如grep
要用到 要加
-E
或者用
egrep
sed
要用的话 必须加
-r
+ 匹配一个或多个前导字符 grep -E bo+ 匹配boo,bo? 匹配零个或一个前导字符 grep -E bo? 匹配b,bo| 或 grep -E a|b() 组字符 看成整体 grep -E (my|your)self 匹配myself或yourself{n} 前导字符重复n次{n,} 前导字符重复至少n次{n,m} 前导字符重复n到m次
第二类正则
[:alnum:] 字母与数字字符 [[:alunm:]]+[:alpha:] 字符字符(包括大小写) [[:alpha:]]{4}[:blank:] 空格与制表符 [[:blank:]]*[:digit:] 数字 [[:digit:]]?[:lower:] 小写字母 [[:lower:]]{4,}[:upper:] 大写字母 [[:upper:]]+ [A-Z][:punct:] 标点符号 [[:punct:]][:space:] 包括换行符,回车在内的所有空白 [[:space:]]+grep -E [[:alunm:]]+
正则表达式总结
- 1.我要找什么
找数字 [0-9]找字母 [a-zA-Z]找标点符号 [[:punct:]]
- 2.我要如何找
以什么为首 ^key以什么为结尾 key$包含什么或者不包含什么 [abc] ^[abc][^abc]^[^abc]
- 3.我要找多少
找前导字符出现0次或连续多次 ab*找任意单个字符 ab.找任意字符 ab.*找前导字符连续出现几次 {n} {n,} {n,m}找前导字符出现1次或者多次 go+
1.1.1.1[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}([0-9]{1,3}\\.){3}[0-9]{1,3}\\d+\\.\\d+\\.\\d+\\.\\d+(\\d+\\.){3}\\d+
案例
1.查找不以大写字母开头的行grep \'^[^A-Z]\'grep -v \'^[A-Z]\'grep \'^[^[:upper:]]\'2.查找所有数字的行grep [0-9]grep -P \'\\d\'3.查找一个数字和在一个字母连起来grep -E \'[0-9][a-zA-Z]|[a-zA-Z][0-9]\'4.查找不以r开头的行grep -v \'^r\'5.查找以数字开头的行grep \'^[0-9]\'6.查找以大写字母开头的grep \'^[A-Z]\'7.查找以小写字母开头的grep \'^[a-z]\'8.查找以点结束的grep \'\\.$\'9.去掉空行grep -v \'^$\'10.查找完全匹配abc的行grep \'\\<abc\\>\'grep -w \'abc\'11.查找A后面有3个数字的行grep \'A[0-9]{3}\'12.统计root在/etc/passwd出现几次 -o 只显示匹配项grep -o \'root\' /etc/passwd | wc -l13.用正则找出自己的ip地址 广播地址 子网掩码ifconfig|grep -oE \'([0-9]{1,3}\\.){3}[0-9]{1,3}\'14.找出文件中的ip地址并且打印替换为172.16.2.254grep -o -E \'([0-9]{1,3}\\.){3}[0-9]{1,3}\' 1.txt | sed -n \'s/192.168.0.\\(254\\)/172.16.2.\\1/p\'15.找出文件中的ip地址grep -oE \'([0-9]{1,3}\\.){3}[0-9]{1,3}\' 1.txt16.找出全部是数字的行grep -E \'^[0-9]+$\'17.找出邮箱地址grep -E \'^[0-9a-zA-Z]+@[a-z0-9]+\\.[a-z]+$\'