. 1個字符。
? 可能沒有,也可能有一個。0或1個字符。
- 任意個前面的字符。0到*。
- 至少一個,沒有?給你加一個。1到*。
正則表達式可以只包含普通的文本,代表去精確匹配這個文本。
正則表達式默認是區分大小寫的,所以song 不會匹配 "Song" 。但是大部分的正則表達式
實現都提供了一個選項表示不區分大小寫。. 用來匹配一個任意字符。
多個連續的 . 可以匹配多個連續的任意字符。. 在正則表達式中含有特殊的意義,是一個特殊的字符。\ 也是特殊字符,可以對特殊
字符起到轉義作用。如果你想匹配的是一個真正的" . "字符,需要在. 前面加上\ 對字符
進行轉義。所以, . 表示真正的" . "字符。匹配一組(幾個)特定的字符可以使用 [ 和 ] 元字符。
[ab] 會匹配" a "或者" b "。字符組區間。
c[a‐z]t 表示以 "c" 開頭,"t" 結尾,中間為字母 "a" - "z" 的任意一個字母。[a‐z] 匹配所有的小寫字母,而 [^a‐z] 匹配所有的不是小寫字母的字符。
^ 字符是將字符集合中的所有字符都取消匹配。[\b] 退格符
\f 換頁符
\n 換行
\r 回車
\t 制表符
\v 垂直制表符
例如\r\n 將匹配一個回車換行組合,在 Windows 中表示一個文件換行。
在 Linux 和 Unix 系統中,只需要使用 \n 即可。\d 任何數字 (同 [09])
\D 任何非數字 (同 [^09])
\w 所有的文字數字式字符:大小寫字母、數字和下劃線 (同 [azAZ09_])
\W (同 [^azAZ09_])
\s 所有的空白字符 (同 [\f\n\r\t\v])
\S 所有的非空白字符 (同 [^\f\n\r\t\v])+
匹配【一個】或【多個】字符。例如, a 將匹配"a",而a+ 則匹配一個或者多個"a"。
在字符集合上使用+ 的時候,需要將+ 符號放在集合外面。c[0‐9]+t 表示以 "c"開頭,以"t"結尾,中間為一個或多個數字的字符串。
[0‐9+] 也是一個合法的正則表達式,但它表示一個包含 " 0 " - " 9 " 和 " + " 符號的字符集合。一般的,元字符如. 和+ 等用于字符集合的時候是作為字面含義使用的,因此沒有必要轉義。但是對其進行轉義也沒錯,所以, [0‐9+] 和[0‐9+] 的功能是一樣的。
*
匹配【零個】或【多個】「某字符」的時候,可以將 * 元字符放在「某字符」后面。? 匹配【零個】或【一個】字符。所以, ? 非常適合于在文本中匹配一個可選的字符。
使用匹配次數。正則表達式允許指定匹配的次數。次數可以在“ { ”和“ } ”之間指定。
{3} 將匹配 3 次前面出現的字符或集合。
{2,} 意味著匹配 2次或者更多次。
{2,3} 意味著最少匹配 2次,最多匹配3次。貪婪匹配。
s.g并沒像預想中的匹配兩個" song ",而是匹配了第一個" s "和最后一個 " g "之間的所有文本。
song xiao song
因為和+都是貪婪匹配。也就是說,正則表達式總是尋找最大的匹配,而不是最小的,這是故意設計的。?號用于構建非貪婪匹配。
非貪婪量詞是在量詞后面加上?
貪婪量詞 非貪婪量詞
*
*?
+
+?
{n,} {n,}?字符串邊界匹配的元字符是^和$,分別用于字符串的開始和結束。
^如果位于集合開始處的話,則表示否定;如果在集合外面,則將匹配字符串的開始位置。
大家可以試試[0-9]和[0-9]的區別。模式重復。子表達式。
通過(和)括起來的就是子表達式。
\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
(\d{1,3}.){3}\d{1,3}模式分組。子表達式。
19|20\d{2}用來定位一個前兩個數字只能為19或者20的四位數的年份。但是很顯然這個正則并沒有實現預想的效果。|操作符從左到右讀取,將19|20\d{2}分析為要么19,要么20\d{2},也就是匹配數字19或者20開頭的四個數字字符。
解決方法是將19|20作為一個子表達式,(19|20)\d{2}就能夠匹配所有19和20開頭的四個數字了。嵌套子表達式。
匹配所有的合法 IP 地址:(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])).){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))后向引用。(用時再看)
采用 <H1> 開始而采用 </H6> 的標題標簽是非法的,但是現在的模式可以匹配。問題在于匹配的第二個部分(匹配結束的標簽)沒有辦法知道匹配第一部分(匹配開始的標簽)是什么。這時候就需要后向引用了。