這兩天又看了一下正則表達(dá)式的入門手冊(cè),有些原來沒有注意到的東西,記錄一下。
匹配類型
有些元字符只匹配位置
- \b
- ^
- $
有些元字符只匹配數(shù)量
- *
- +
- ?
[]中是用來放匹配的字符的,所以匹配位置的東西在里面是無效的
比如我想匹配0:忙,1:閑中的枚舉,如果我用下面的正則是無法匹配的:
([\dH]+):(.*?)[,;$]
因?yàn)?code>$在[]中表示的是字符而不是位置. 正確的寫法是:
([\dH]+):(.*?)([,;]|$)
.*?的解釋
.匹配任意字符,*匹配任意數(shù)量,?使用懶惰模式
后向引用
例:\b(\w+)\b\s+\1\b匹配重復(fù)的單詞,像go go, 或者kitty kitty
零寬斷言
斷言的目的是使用字符串匹配位置但不匹配任何字符串,即被斷言匹配的字符串仍然可以繼續(xù)被匹配。另一種角度來說,可以用來判斷字符串中是否包含某字符串(因?yàn)椴粫?huì)匹配任何字符串)。
- (?=exp) 零寬度正預(yù)測(cè)先行斷言
- (?<=exp) 零寬度正回顧后發(fā)斷言
- (?!exp) 零寬度負(fù)預(yù)測(cè)先行斷言
- (?<!exp) 零寬度負(fù)回顧后發(fā)斷言
例:\b\w*q(?!u)\w*\b匹配包含后面不是字母u的字母q的單詞
理解:正與負(fù)其實(shí)是==和!=的意思;先和后其實(shí)是匹配所在位置右邊和左邊的意思(因?yàn)檫@個(gè)寫在正則表達(dá)式中間分不清是與前面的東西配合還是與后面的東西配合)。
例:
- 匹配后面為_path,結(jié)果為product
'product_path'.scan
/(product)(?=_path)/
(?<=exp):零寬度正回顧后發(fā)斷言,它斷言自身出現(xiàn)的位置的前面能匹配表達(dá)式exp - 匹配前面為name:,結(jié)果為wangfei
'name:wangfei'.scan
/(?<=name:)(wangfei)/
(?!exp):零寬度負(fù)預(yù)測(cè)先行斷言,斷言此位置的后面不能匹配表達(dá)式exp。 - 匹配后面不是_path
'product_path'.scan
/(product)(?!_path)/ - 匹配后面不是_url
'product_path'.scan
/(product)(?!_url)/
(?<!exp):零寬度負(fù)回顧后發(fā)斷言來斷言此位置的前面不能匹配表達(dá)式exp - 匹配前面不是name:
'name:angelica'.scan
/(?<!name:)(angelica)/ - 匹配前面不是nick_name:
'name:angelica'.scan
/(?<!nick_name:)(angelica)/
多行模式和單行模式并不是反義詞
- 多行模式:
^和$分別匹配任意一行的行首和行尾 - 單行模式:
.也匹配換行符\n
體會(huì)
- 之前一直用
{1,}來表示重復(fù)1次及以上,其實(shí)用+就可以 - 要搞明白使用正則表達(dá)式的庫的函數(shù)都是干什么用的,下篇就寫這個(gè)吧
常用正則表達(dá)式
- IP:
(([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5]).){3}([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5]) - IP:
((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)) - Email地址:
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ - 域名:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? - 手機(jī)號(hào)碼:
^(13[0-9]|14[0-9]|15[0-9]|166|17[0-9]|18[0-9]|19[8|9])\d{8}$ - 強(qiáng)密碼(包含大小寫、數(shù)字,無特殊字符,長度8-10):
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$(斷言) - 日期格式:
^\d{4}-\d{1,2}-\d{1,2} - 中文字符:
[\u4e00-\u9fa5] - 空白行:
\n\s*\r(^\s*\n)
還沒搞明白的特殊匹配方法
平衡組/遞歸匹配