正則表達式是一種被用於從文本中檢索符合某些特定模式的文本。html
正則表達式是從左到右來匹配一個字符串的。"Regular Expression" 這個詞太長了,咱們一般使用它的縮寫 "regex" 或者 "regexp"。 正則表達式能夠被用來替換字符串中的文本、驗證表單、基於模式匹配從一個字符串中提取字符串等等。正則表達式
想象一下,您正在編寫應用程序,而且您但願在用戶選擇用戶名時設置規則。咱們但願用戶名能夠包含字母,數字,下劃線和連字符。 爲了讓它看起來不醜,咱們還想限制用戶名中的字符數量。咱們能夠使用如下正則表達式來驗證用戶名學習
正則表達式爲經常使用的字符集和經常使用的正則表達式提供了簡寫。簡寫字符集以下:spa
簡寫 | 描述 |
---|---|
. | 匹配除換行符之外的任意字符 |
\w | 匹配全部字母和數字的字符: [a-zA-Z0-9_] |
\W | 匹配非字母和數字的字符: [^\w] |
\d | 匹配數字: [0-9] |
\D | 匹配非數字: [^\d] |
\s | 匹配空格符: [\t\n\f\r\p{Z}] |
\S | 匹配非空格符: [^\s] |
\b | 匹配單詞的開始或結束 |
\B | 匹配非單詞的開始或結束 |
^ | 匹配字符串的開始 |
[^x] | 匹配除了x意外的任意字符 |
$ | 匹配字符串的結束 |
[a-zA-Z0-9_]
[^\w]
[0-9]
[^\d]
[\t\n\f\r\p{Z}]
[^\s]
不加\b效果3d
加上\b的效果code
兩邊都加上\bregexp
前面加上\bhtm
後面加上\bblog
\B加前面ip
\B加後面
\d+
^\d+
\d+$
^\d+$
正則表達式中使用反斜槓 \
來轉義下一個字符。這將容許你使用保留字符來做爲匹配字符 { } [ ] / \ + * . $ ^ | ?
。在特殊字符前面加 \
,就能夠使用它來作匹配字符。 例如正則表達式 .
是用來匹配除了換行符之外的任意字符。如今要在輸入字符串中匹配 .
字符,正則表達式 (f|c|m)at\.?
,表示: 小寫字母 f
、c
或者 m
後跟小寫字母 a
,後跟小寫字母 t
,後跟可選的 .
字符。
元字符是正則表達式的基本組成元素。元字符在這裏跟它一般表達的意思不同,而是以某種特殊的含義去解釋。有些元字符寫在方括號內的時候有特殊含義。 元字符以下:
元字符 | 描述 |
---|---|
. | 匹配除換行符之外的任意字符。 |
[ ] | 字符類,匹配方括號中包含的任意字符。 |
[^ ] | 否認字符類。匹配方括號中不包含的任意字符 |
* | 匹配前面的子表達式零次或屢次 |
+ | 匹配前面的子表達式一次或屢次 |
? | 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。 |
{n,m} | 花括號,匹配前面字符至少 n 次,可是不超過 m 次。 |
(xyz) | 字符組,按照確切的順序匹配字符xyz。 |
| | 分支結構,匹配符號以前的字符或後面的字符。 |
\ | 轉義符,它能夠還原元字符原來的含義,容許你匹配保留字符 [ ] ( ) { } . * + ? ^ $ \ | |
^ | 匹配行的開始 |
$ | 匹配行的結束 |
.*d 匹配以d結尾的字符
.d 匹配以d結尾的,而且包含他前面的一個字符
.?d 匹配以d結尾的,而且包含他前面的一個字符
\b.?ld\b
^.?ld$
解讀:^和$z作字符限定,.?ld表示匹配以ld結尾,前面只能有一個字符
[abc]ld 匹配ld前面是以a、b、c開頭的
[^abc]ld 匹配ld前面是非以a、b、c開頭的
如下元字符 +
,*
或 ?
用於指定子模式能夠出現多少次。這些元字符在不一樣狀況下的做用不一樣。
該符號 *
表示匹配上一個匹配規則的零次或屢次。正則表達式 a*
表示小寫字母 a
能夠重複零次或者屢次。可是它若是出如今字符集或者字符類以後,它表示整個字符集的重複。 例如正則表達式 [a-z]*
,表示: 一行中能夠包含任意數量的小寫字母。
該 *
符號能夠與元符號 .
用在一塊兒,用來匹配任意字符串 .*
。該 *
符號能夠與空格符 \s
一塊兒使用,用來匹配一串空格字符。 例如正則表達式 \s*cat\s*
,表示: 零個或多個空格,後面跟小寫字母 c
,再後面跟小寫字母 a
,再再後面跟小寫字母 t
,後面再跟零個或多個空格。
該符號 +
匹配上一個字符的一次或屢次。例如正則表達式 c.+t
,表示: 一個小寫字母 c
,後跟任意數量的字符,後跟小寫字母 t
。
"c.+t" => The fat cat sat on the mat.
在正則表達式中,元字符 ?
用來表示前一個字符是可選的。該符號匹配前一個字符的零次或一次。 例如正則表達式 [T]?he
,表示: 可選的大寫字母 T
,後面跟小寫字母 h
,後跟小寫字母 e
。
0\d{2,3}-\d{7,8}
tip:咱們會發現匹配的第二個號碼後面還有個9,那麼咱們該如何加上限定,不讓他匹配後面的呢,就用到了前面學的^和$,來看示例
tip:上面的例子確實匹配到了正確的號碼,但真實生活中的例子每每是每一個地區的電話號碼寫法都不同,看下圖示例如何解決
ps:上面的例子不少條件放到了一塊兒,不利於閱讀,咱們能夠用分支來解決,符合其中任一一種正則便可,看下圖示例
將表達式進行作成子集
使用()進行分組
方便match的字符串進行劃分
分組的命名:(?<groupname>exp)
(?:exp) 匹配exp,不捕獲匹配的文本,也不給分組分配組號
<div\s+class="(?:result|result-op)\s+c-container\s+.*?<a.*?>(?<baiduTitle>.*?)</a>
懶惰
語法 | 說明 |
---|---|
*? | 重複任意次,但儘量少重複 |
+? | 重複一次或更屢次,但儘量少重複 |
?? | 重複0次或更屢次,但儘量少重複 |
{n,m} | 重複n次到m次,但儘量少重複 |
{n,} | 重複n次以上,但儘量少重複 |
貪婪
所謂貪婪就是儘量多的匹配,它遇到第一個b不結束,遇到最後一個b才結束
懶惰
遇到個b就匹配成功
語法 | 說明 |
---|---|
IgnoreCase | 匹配時不區分大小寫 |
Multiline | 更改^和$的含義,是它們分別在任意一行的行首和行尾匹配,而不單單在整個字符串的開頭和結尾匹配。(在此模式下,$的精確的含義是:匹配\n以前的位置以及字符串結束前的位置) |
Singleline | 更改.的含義,使它與每個字符匹配(包括換行符\n) |
IgnorePatternWhitespace | 忽略表達式中的非轉義空白並啓用由#標記的註釋 |
ExplicitCapture | 僅捕獲已被顯式命名的組 |
匹配taobao taobao,home home 這樣的狀況
\b(\w+)\b\s+\1\b
\b(?<Word>\w+)\b\s+\k<Word>\b 命名後的寫法
例一:
\b(\w+)\b\s+\1\s+\1
?=exp 零寬度正預測先行斷言,自身出現的位置的後面能匹配表達式
exp
\b\w+(?=ing\b)
?<=exp 零寬度正回顧後發斷言,自身出現的位置的前面能匹配表達式
exp
<?<=\bre>\w+\b
查找這樣的單詞,它裏面出現了字母q,但q後面跟的不是字母u
不用斷言的方式
\b\w*q[^]\w*\b
使用斷言 不消費任何字符
例一:
\b\w*q(!u)\w\b
例二:前面三位是數字,後面不能是數字
\d{3}(?!\d)
例一:前面不是小寫字母的7位數字
(?<![a-z])\d{7}
例一:找出全部個位數
(?<=\s+)\d(?=\s+)|(?<!\d)\d(?!\d)