正则表达式练习笔记
下面的內(nèi)容是一個(gè) data1.txt 文本內(nèi)容,里面記錄了一些正則表達(dá)式的筆記
long long ago there is girl, she's name is little redhat.. long_long_long#long;long:long This is a test txt... my phone number is 18621735531There are a lot of good books,220123 12345E-mail:hemmingway@163.com new...............231592315y12#$@%#$@^%$^$@<>?{}|}S#$!@#%ik iek ieek ieeek ieeeek ieeeeek ieeeeeekiek22222 iekddddd iekwwwwwwwwwwwwwwwwwwwwwwwwwwwwww iek shit upthis is iekkkk stringnekkkk cek dek sekjjjd# 組合描點(diǎn) grep -n ^$ data1.txt, 可以濾出來(lái)空白行 #grep -n This is ^a data1.txt #grep -n ^[0-9][0-9][0-9][0-9][0-9]$ data1.txt \ #grep -n ie*k data1.txt 一、錨點(diǎn) 鎖定行首 ^ 鎖定行尾 $ 組合錨點(diǎn) ^$二、單個(gè)字符匹配 字符組 [..] [^...] . 一個(gè)字符占位符,不包括換行 * 匹配前一個(gè)字符出現(xiàn)任意次次數(shù)=====================================我是分割線================================== 下面是擴(kuò)展的 正則表達(dá)式? 匹配前一個(gè)字符有或者沒(méi)有,就是0次要么1次 + 匹配前一個(gè)字符需要出現(xiàn)的,不管次數(shù)模式匹配次數(shù) {m} 精確的m次數(shù) {m,} 大于m次,n為無(wú)窮大 {m,n} 大于m次, 小于n次圓括號(hào)聚合匹配格式 () (||)舉個(gè)列子:比如下面的命令匹配 iek 字符串 #grep -n -E ie\{1\}k data1.txt #grep -n -E ie{1}k data1.txt匹配 ie 出現(xiàn)一次的,不是2次,也不是 se,de,其他字符串 #grep -n -E ie\{1\} data1.txt比如,給出下面一些字符串,想要匹配星期六的符串, Sat. 縮寫或者全寫 Saturday:SatSomething Satelse Sat. Saturday# grep -n -E '^Sat(urday|.)?$' data1.txt復(fù)雜的例子 一:匹配電話號(hào)碼,如下面四種形式 (223)456-7890 (223) 456-7890 223 456-7890 223 456-7890 223456-7890 223-456-7890 ###223-456-7890 223.456.7890 223.456-7890 223-456.7890分析,首先,開頭的 左邊圓括號(hào) '\(' 可有可無(wú)的, 所以得到:^\(? 再看 123 是三個(gè)數(shù)字的區(qū)號(hào),美國(guó)電話號(hào)碼區(qū)號(hào)是以2開始的數(shù)字開始的,最大到9, 后兩個(gè)數(shù)字任意的,因此匹配區(qū)號(hào)是:[2-9][0-9]{2}接下來(lái)分析區(qū)號(hào)后面, 收尾的右圓括號(hào) '\)' 可能存在,也可能不存在,單獨(dú)去取出來(lái)和左邊對(duì)應(yīng),匹配方式為:\)?接下來(lái),可能有一個(gè)空格或者沒(méi)有, 一個(gè)破折號(hào) '-' 一個(gè)點(diǎn)號(hào) '\.' ,可以用管道符號(hào)可圓括號(hào)處理得到:(| |-|\.)接下來(lái)是三位電話交換機(jī)號(hào)碼,沒(méi)有什么特殊的[0-9]{3}接下來(lái),交換機(jī)號(hào)碼后面可能有一個(gè)空格,一個(gè)破折號(hào)或者一個(gè)點(diǎn)號(hào)( |-|\.)最后是尾部的四位本地電話分機(jī)號(hào)碼:[0-9]{4}$最后,拼接起來(lái)整個(gè)模式為:^\(?[2-9][0-9]{2}\)?(| |-|\.)[0-9]{3}( |-|\.)[0-9]{4}$最后查找匹配合格的電話號(hào)碼:nfs@nfs-Lenovo:~$ grep -n -E '^\(?[2-9][0-9]{2}\)?(| |-|\.)[0-9]{3}( |-|\.)[0-9]{4}$' data1.txt 91:(223)456-7890 92:(223) 456-7890 93:223 456-7890 95:223456-7890 96:223-456-7890 98:223.456.7890 99:223.456-7890 100:223-456.7890思考,這個(gè)regex還有個(gè)bug, 就是 223456-7890也是合法寫法電話,想要把這個(gè)case排除,新的匹配模式怎么寫? 如果 區(qū)號(hào) 沒(méi)有被括號(hào)包圍,那么一定需要一個(gè) 空格隔開。。。。。。。。。。。。。。答題: 需要將 區(qū)號(hào) 部分重新提煉出來(lái)處理,分成有括號(hào)的區(qū)號(hào)和沒(méi)有括號(hào)的區(qū)號(hào),有括號(hào)區(qū)號(hào)匹配如下:^\([2-9][0-9]{2}\)沒(méi)有括號(hào)的區(qū)號(hào)匹配如下:^[2-9][0-9]{2}再次做一個(gè)改變,將區(qū)號(hào)后面的符號(hào)提到前面處理,因次分別得到:^\([2-9][0-9]{2}\)(| |-|\.)和(這個(gè)模式后面不跟空格,只有破折號(hào)和點(diǎn)號(hào))^[2-9][0-9]{2}( |-|\.)將這兩種case合并得到下面的模式可以匹配區(qū)號(hào):(^\([2-9][0-9]{2}\)(| |-|\.)|^[2-9][0-9]{2}( |-|\.))最后合并得到新的電話號(hào)碼匹配模式:(^\([2-9][0-9]{2}\)(| |-|\.)|^[2-9][0-9]{2}( |-|\.))[0-9]{3}( |-|\.)[0-9]{4}$進(jìn)行測(cè)試:$ grep -n -E '(^\([2-9][0-9]{2}\)(| |-|\.)|^[2-9][0-9]{2}( |-|\.))[0-9]{3}( |-|\.)[0-9]{4}$' data1.txt 91:(223)456-7890 92:(223) 456-7890 93:223 456-7890 96:223-456-7890 98:223.456.7890 99:223.456-7890 100:223-456.7890復(fù)雜列子二:匹配郵箱地址E-mail格式為:username@hostnameusername可以使用的字符有 字母數(shù)字字符以及一些特殊字符,如下:1.點(diǎn)號(hào) 2.破折號(hào) 3.加號(hào) 4.下劃線所以,username匹配方式為:^([a-zA-Z0-9_\-\.\+]+)@接下來(lái)分析 hostname的服務(wù)器名字和子域名,這部分可以是字母數(shù)字字符,以及點(diǎn)號(hào)和下劃線:([a-zA-Z0-9_\-\.]+)這個(gè)模式可以匹配文本: server server.subdomain server.subdomain.subdomain接下來(lái)就是 hostname中的頂級(jí)域名部分,不考慮中文域名,頂級(jí)域名要是是2到5個(gè)字母組成的,頂級(jí)域名為:\.([a-zA-Z]{2,5})$所以匹配郵箱地址為:^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$rich.john@sari.ac.cn wangxf@163.com rich.O.johl@hotmail.com$ grep -n -E '^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$' data1.txt最后一個(gè)列子,匹配QQ號(hào)碼,QQ號(hào)碼是6個(gè)以上的數(shù)字,假設(shè)最大數(shù)字是13,不以0開頭的,匹配模式如下:^[1-9][0-9]{5,}$測(cè)試如下QQ號(hào)碼:038216437 123 12345 382164370 281120661 754198142 ###754198142 754198142## 1123564020 11111111111111111111111111111465nfs@nfs-Lenovo:~$ grep -n -E '^[1-9][0-9]{5,12}$' data1.txt 9:220123 253:382164370 254:754198142 255:1123564020nfs@nfs-Lenovo:~$ grep -n -E '^[1-9][0-9]{5,12}$' data1.txt 9:220123 253:382164370 254:754198142 255:1123564020 nfs@nfs-Lenovo:~$ 匹配整數(shù)寫法,整數(shù)前面一個(gè)破折號(hào)表示負(fù)數(shù),或者一個(gè)可有可無(wú)的 + 號(hào),匹配模式如下:^(|-|\+)接下來(lái)是第一個(gè)數(shù)字,非0,后面不限,因此[1-9][0-9]*$合并得到正數(shù)的匹配寫法是:^(|-|\+)[1-9][0-9]*$測(cè)試整數(shù): -1203 5554 +7894 -2222222 #24545# grep -n -E '^(|-|\+)[1-9][0-9]*$' data1.txt再寫一個(gè)簡(jiǎn)單的,匹配字母數(shù)字字符串。^[a-zA-Z0-9]+$# grep -n -E '^[a-zA-Z0-9]+$' data1.txt匹配空行#grep -n -E '^$' data1.txt最后一個(gè)奇怪的測(cè)試:([\\/$]* | ?:[\\/]*)測(cè)試:x:\test\test z:/test1/test1 ${datarootdir}/doc/${PACKAGE_TARNAME} ${datarootdir}/doc/man# grep -E '([\\/$]* | ?:[\\/]*)' data1.txt總結(jié)
- 上一篇: Ubuntu 14.04 LTS 下升级
- 下一篇: VS2015编译boost 1.62.0