區別於常見的正則表達式教程,本教程讓你快速入門,並規避常見問題。正則表達式
(你們能夠閱讀完後邊的教程再閱讀注意事項,注意事項放在前邊只是爲了引發注意)數組
在開始以前先說一些值得你們注意的事項吧工具
1 正則表達式沒有邏輯與、邏輯非關係。那麼要實現邏輯與,就要靠表達式序列來實現了,也就是組合。而邏輯非要靠零寬斷言來實現了,可是不幸的是,如今大多數工具對斷言啊,分組捕獲啊,的支持並不完整。好比sed,是不支持斷言的。教程
2 正則表達式的邏輯或關係,在正則表達式中是靠多選來實現的。遞歸
3 請謹遵語法,對於那些用慣了一個*來表明若干字符的,請注意,這並非標準的正則表達式,而是一些工具本身內部封裝的特殊符號。字符串
4 注意匹配的範圍,正則表達式默認是匹配最大範圍,就是說你們要考慮匹配句子?匹配單詞?匹配單詞的一部分?好比有如下的文本行,int main(int argc... ,對於表達式.*t\b將匹配如下內容 int main(int,而若是你用\w*t\b,將只匹配2個int,更嚴謹的表達方式是\b\w*t\b。因此建議你們儘量使用表明小範圍的通配符(元字符)。it
5 至於貪婪和懶惰啊,遞歸啊,這些在某些語言中有支持,可是這個由於語言差別太大,本文不做詳述。io
一些符號注意事項入門
1 - 連字符,這個只在字符組內有特殊意義,在字符組外表明字符自己。sed
2 ^ 脫字符,在字符組內的最前位置時表示排除的意思,在字符組內的其它位置表示字符自己,在字符組外則是通配符,表示行首。
3 . $ * + ? { } ( ) | ,在字符組內表示字符自己,在字符組外則是通配符或做用符。
4 字符組內,[ 和 ] 須要轉義
5 分組內,( 和 ) 須要轉義
正則表達式是記錄文本規則的代碼,主要的做用就是用於匹配文本。
語法:[內容][次數]
1 咱們把一個內容和次數組成的塊叫小節,那正則表達式就是由若干個小節構成的。
2 內容後若是不加次數表明內容出現一次。
3 特定內容(位置元字符)後不該該跟次數。好比 ^ 和 $ 。
內容能夠是普通字符、元字符、邏輯表達式和引用。
元字符表
. 匹配除換行符之外的任意字符 \w 匹配字母或數字或下劃線或漢字 \s 匹配任意的空白符 \d 匹配數字 \b 匹配單詞的開始或結束 ^ 匹配字符串的開始 $ 匹配字符串的結束 \W 匹配任意不是字母,數字,下劃線,漢字的字符 \S 匹配任意不是空白符的字符 \D 匹配任意非數字的字符 \B 匹配不是單詞開頭或結束的位置
注意:其中\b、^、$、\B不表明任何字符位,他們表明一個位置,咱們稱他們爲位置元字符,其它元字符稱爲佔位元字符。
次數表
* 重複零次或更屢次 + 重複一次或更屢次 ? 重複零次或一次 {n} 重複n次 {n,} 復n次或更屢次 {n,m} 重複n到m次
例:
\d{5} 能夠匹配 99999 \w*ing 能夠匹配 doing \w+ing 能夠匹配 doing \w{2}ing 也能夠匹配 doing
邏輯表達式
咱們把邏輯表達式劃分爲組合、字符組、分組、多選。
組合
像 \w*ing 是由4個小節構成的,分別是\w*、i、n、g。
字符組
[]中括號擴起來的若干字符表示一個字符組,字符組內的字符是"或"的關係。
字符組內可以使用連字符-。
注意:字符組後邊的次數,通常用 + 而不用 *,由於字符組後用 * 會匹配到出現0次的狀況,這種狀況會匹配到 \b 。
好比你想用字符組匹配2個單詞 int 或 argc,[(int)(argc)] 是錯誤的,這個表明2個分組,而分組內又是組合。集合內不能識別分組,將小括號識別爲普通字符。
看來結果將不符合你的預期,這種邏輯建議使用或來表述 \bint\b|\bargc\b。
例:
[int] 分別匹配字符i、n、t [0-9] 分別匹配0到9 \b[int]+\b 能夠匹配到單詞int、in、it
排除字符組
^ 表示排除
注意:若是你想在字符組內使用排除法去匹配一個單詞(見下面的例子),建議你在集合內加上 \W (大寫),不然空格和一些特殊字符也會被匹配到。
例:
[^x] 匹配除了x之外的任意字符。 [^aeiou] 匹配除了aeiou這幾個字母之外的任意字符 \b[^int\W]\b 匹配不出現字符i、n、t的單詞,若是不加 \W ,空格和一些特殊字符就不被排除
分組
()用小括號括起來的子表達式
例:
(\d{1,3}\.){3} 匹配999.999.999.
多選
| 表示"或"
注意:或的優先級低於其它任何邏輯表達式。可以使用分組來提升或的優先級。
例:
\bint|argc\b 除了能夠匹配到 int 或 argc,還能夠匹配到 inta 或 hargc內的部分字符 \b(int|argc)\b 只匹配單詞 int 或 argc
轉義字符
\使用斜槓來顯現轉義字符。
全部的元字符、次數符、邏輯符號都須要轉義。
需轉義的字符有
\ . ^ $ * + ? { } [ ] ( ) |
後向引用
引用容許在後邊的表達式中引用前邊捕獲到的分組的文本。
分組被捕獲,而後用\斜槓加數字引用捕獲到的內容。
命名捕獲在不一樣的語言中有不一樣的表示方法(Paython中使用(?P<name>group),.NET framework 中使用(?<name>group)),在這裏不詳述。
例:
\b(\w+)\b\s+\1\b 捕獲像 go go, 或者kitty kitty 這樣的疊詞
零寬斷言
斷言是一種判斷,就是判斷是否符合斷言表達式,符合時才匹配其它內容,不符合就不匹配。
注意:斷言的內容不被匹配,這也是爲何它們被稱爲零寬的緣由。
零寬斷言不能單獨存在,必須與非零寬的表達式組合。
不是全部的工具都支持全部的零寬斷言。
斷言表達式
(?=exp) 匹配exp前面的位置 (?<=exp) 匹配exp後面的位置 (?!exp) 匹配後面跟的不是exp的位置 (?<!exp) 匹配前面不是exp的位置
斷言分爲正向斷言和負向斷言,上表前2個表達式是正向斷言,後2個表達式是負向斷言。
例:
\b\w+(?=ing\b) 匹配以ing結尾的單詞 (?<=\bre)\w+\b 匹配以re開頭的單詞 \b((?!abc)\w)+\b 匹配不包含連續字符串abc的單詞 (?<![a-z])\d{7} 匹配前面不是小寫字母的七位數字