正則表達式是一種能夠在許多現代應用程序和編程語言中使用的特殊形式的代碼模式。
git
· 但是用它來驗證輸入是否符合給定的文本模式正則表達式
· 在大段文本中查找匹配該模式的文本編程
· 用其餘文原本替換匹配該模式的文本或者從新組織匹配文本的一部分編程語言
· 把一塊文本劃分紅一系列更小的文本ide
……等等spa
一、正則表達式基礎
1.1 元字符和語法orm
字符:
. 匹配任意除換行符'\n' 之外的字符 字符串
如:a.c 匹配abcit
\ 轉義字符 class
如:a\.c 匹配 a.c
[...] 字符集(字符類)。對應的位置能夠是任意字符。 如:a[bcd]e 匹配 abe ace ade
能夠單個列出,也能夠給定範圍,也能夠取反^
預約義字符集:
\d 數字[0-9]
\D 非數字,至關於[^\d]
\s 空白字符:[<空格>\t\r\n\f\v]
\S 非空字符:[^\s]
\w 單詞字符:[A-Za-z0-9]
\W 非單詞字符:[^\w]
字符集合:
[[:space:]] :全部空白字符
[[:punct:]] :全部的標點符號
[[:lower:]] :全部小寫
[[:upper:]] :全部大寫
[[:digit:]] :全部數字
[[:alnum:]] :匹配字母和數字
[[:alpha:]] :全部字母
次數匹配:
* 匹配前一個字符的0 或無限次
+ 匹配前一個字符1次或無限次
? 匹配前一個字符0次或1次
{m} 匹配前一個字符m次
{m,n} 匹配前一個字符m至n次
*? +? ?? {m,n}? 使* + ? {m,n}變成非貪婪模式
邊界匹配(不消耗匹配字符串中的字符)
^ 匹配字符串開頭。多行模式下匹配每一行的開頭
如:^abc 匹配 abc
$ 匹配字符串結尾。多行模式下匹配每一行的結尾
如:abc$ 匹配 abc
\A 僅匹配字符串開頭
\Z 僅匹配字符串末尾
\b 匹配字符串結尾
\B [^\b]
\< 詞首, 出現於單詞的左側. \b
\<char
\> 詞尾, 出如今單詞的右側. \b
char\>
\<CHAR\> 錨定一個單詞
邏輯、分組
| |表示左右表達式任意匹配一個
例如:abc|cbd 匹配 abc 或者cbd
(...) 括號裏面的表達式做爲分組,後面還能夠接數量詞
如:(abc){2}匹配 abcabc a(123|456)c 匹配 a123c
(?P<name>) 分組,除了原有的編號外,再指定一個別名。
如:(?P<id>abc){2}匹配abcabc
\<number> 引用編號爲<number>的分組匹配到的字符串。
如:(\d)abc\1 匹配 1abc1
(?P=name) 引用別名爲<name>的分組匹配到的字符串。
如:(?P<id>\d)abc(?P=id)匹配 1abc1
特殊構造(不做爲分組)
(?:...) (...)的不分組版本,用於使用'|'或後接數量詞
如:(?:abc){2}匹配 abcabc
(?iLmsux) iLmsux的每個字符表明一個匹配模式,只能用在正則表達式的開頭,可選多個。 如:(?i)abc 匹配ABC
(?#...) #後的內容將做爲注視被忽略。
如:abc(?#comment)123 匹配 abc123
(?=...) 以後的字符串內容須要 匹配表達式 才能成功匹配。不消耗字符串內容。 如:a(?=\d) 匹配後面是數字的a
(?!...) 以後的字符串內容須要 不匹配表達式 才能成功匹配。不消耗字符串內容。
如:a(?!\d)匹配 後面不是數字的a
(?<=...) 以前的字符串內容須要 匹配表達式 才能成功匹配。不消耗字符串內容。
如:a(?<=\d)匹配 前面是數字的a
(?<!...) 以前的字符串內容須要 不匹配表達式 才能成功匹配。不消耗字符串內容。
如:a(?<!\d)匹配 前面不是數字的a
(?(id/name)yes-pattern|no-pattern) 若是編號爲id/別名爲name的組匹配到字符串,則須要匹配yes-pattern,不然匹配no-pattern. |no-pattern 能夠省略
如:(\d)*abc(?(1)\d|abc) 匹配 1abc2 或者 abcabc
1.2. 數量詞的貪婪模式與非貪婪模式正則表達式一般用於在文本中查找匹配的字符串。數量詞默認是貪婪的(在少數語言裏也多是默認非貪婪),老是嘗試匹配儘量多的字符;非貪婪的則相反,老是嘗試匹配儘量少的字符。例如:正則表達式"ab*"若是用於查找"abbbc",將找到"abbb"。而若是使用非貪婪的數量詞"ab*?",將找到"a"。