簡單的學習一下正則表達式吧
- 最簡單的,比如匹配matrix
- 這樣會匹配到所有含有matrix的,比如,matrix67,matrix123等
- \b metacharacter
- 匹配一個位置,代表開頭或者結尾
- 比如,
\bmatrix\b
就是匹配單詞matrix了
- . 匹配除了換行符外所有的元素
- * 閉包
- 比如
.*
就是匹配所有不包含換行的字符串
- 比如
- + 正閉包
- 比如
.+
就是匹配所有不包含換行的字符串,但必須有一位,不能爲空
- 比如
- ? 匹配0次或1次
- \d 匹配一個數字的字符(0,1,2…,9)
0\d\d-\d\d\d\d\d\d\d\d
就是匹配一個電話號碼,可以簡寫爲0\d{2}-\d{8}
- \s 匹配任意的空白符,空格,製表符(Tab),換行
- \w 匹配字母,數字,下劃線,漢字等
- ^ 匹配字符串的開始
- $ 匹配字符串的結束
^\d{6,9}$
就是匹配所有6~9位的數字
- [] 匹配括號內的字符
[0-9]
就相當於\d[matrix]
匹配m,a,t,r,i,x中的一個字符\(?0\d{2}[) -]?\d{8}
就是匹配一個電話號碼
- | 或者
- 上邊的匹配電話號碼有問題,(011-12345678 這樣的也會匹配
- 那麼可以這樣修改
\(0\d{2}\)\d{8}|0\d{2}[ -]\d{8}
- () 分組
(\d{1,3}\.){3}\d{1,3}
可以是簡單的匹配IP地址,可惜,666.666.666.666這樣的也會被匹配進去,進一步改寫([01]?\d\d?|2[0-4]\d|25[0-5]\.){3}[01]?\d\d?|2[0-4]\d|25[0-5]
比較難想
- 反義:將字母變成大寫(好神奇)
- \W 匹配任意不是字母,數字,下劃線,漢字的字符
- \S 匹配任意不是空白的字符
- \D 匹配任意不是數字的字符
- \B 匹配任意不是單詞開始或結尾的位置
[^matrix]
匹配除了m,a,t,r,i,x以外的其他字符<a[^>]+>
匹配尖括號內,以a開頭的字符串
- 使用小括號指定一個子表達式後,這個子表達式的文本可以被後邊所用,默認情況下,以每個左括號爲標準,從1開始標號
\b(\w+)\b\s+\1\b
表示匹配重複的單詞,比如matrix matrix等
- 當然也可以自己指定組名
(?<name>exp)
表示的就是匹配exp的串,名字是name,捕獲時候\k<name>
即可
- 上邊例子還可以寫爲
\b(?<word>\w+)\b\s+\k<word>\b
- 上邊例子還可以寫爲
- 零寬斷言,用於查找某些特定串的前面或後面的內容
(?=exp)
查找某些串,這些串的尾部是exp,查找結果是匹配的串減去尾部部分,比如\b\w+(?=ing\b)
查找I am singing while you are dancing時,結果爲sing和danc(?<=exp)
查找某些串,這些串的頭部是exp,查找結果是匹配的串減去頭部部分,比如(?<=\bmat)\w+\b
查找I love matrix67 and matrix123是,結果爲rix67和rix123- 比如
(?<=\s)\d+(?=\s)
表示空白符間隔的數字
- 負向零寬斷言
(?!exp)
表示此位置後面不能匹配exp,比如\d{3}(?!\d)
匹配三位數字,並且這三位數字後面不是數字,比如\b((?!abc)\w)+\b
匹配不包含連續abc的單詞(?<!exp)
表示此位置前面不能匹配exp,(?<![a-z])\d{7}
表示前面不是小寫字母的7位數字
(?#comment)
添加註釋- 貪婪與懶惰
- 當匹配能接受重複的串時,通常是接受最長的串,也就是貪婪匹配,比如
a.*b
是匹配以a爲開頭,以b爲結尾的所有的串,當匹配aabab時,匹配的是aabab - 有時候,我們希望匹配的儘可能短,可以這樣
a.*?b
此時再匹配時,就是匹配的aab(0,2)和ab(3,4) *?
重複儘可能少的次數+?
重複一次或更多次,但儘可能少??
重複0次或一次,儘可能少{n,m}?
重複n到m次,儘可能少{n,}
重複至少n次,儘可能少
- 當匹配能接受重複的串時,通常是接受最長的串,也就是貪婪匹配,比如
- 處理選項
IgnoreCase
匹配時不區分大小寫Multiline
多行模式,更改^,的含義,分別在任一行的行首和行尾匹配,在此模式下, 的含義是匹配\n前的位置和字符串結束前的位置Singleline
單行模式,更改.的含義,與每一個字符匹配(包括\n)IgnorePatternWhitespace
忽略空白ExplicitCapture
顯式捕獲,僅捕獲被顯式命名的組
- 遞歸匹配
(?'exp')
把捕獲的內容命名爲exp,並壓入堆棧(?'-exp')
從堆棧上面彈出最後壓入的名爲exp的內容,如果堆棧本來爲空,匹配失敗(?(exp)yes|no)
如果堆棧上存在名爲exp的內容,匹配yes部分的表達式,否則匹配no部分的表達式(?!)
零寬負向先行斷言,由於沒有後綴表達式,試圖匹配總是失敗