表示單個字符。例如a,它將匹配字符串中第一次出現的字符a;它也能夠匹配第二個 a,這必須是你告訴正則表達式引擎從第一次匹配的地方開始搜索。正則表達式
可使用特殊字符序列表明某些不可顯示字符。測試
構造 | 匹配 |
B | 字符B |
\xhh | 十六進制值爲oxhh的字符 |
\uhhhh | 十六進制值爲oxhhhh的Unicode字符 |
\t | 製表符Tab:(‘\u0009’) |
\r | 回車符:(‘\u000D’) |
\n | 換行符:(‘\u000A’) |
\f | 換頁符:(‘\u000C’) |
\e | 轉義符(Escape):(‘\u001B’) |
字符集是由一對括號[]括起來的字符集合。使用字符集,能夠告訴正則表達式引擎僅僅匹配多個字符中的一個。
spa
字符集能夠出如今其它字符集中,而且能夠包含並集運算符(隱式)和交集運算符 (&&)。
code
構造 | 匹配 |
[abc] | a、b或c(等效於a|b|c) |
[^abc] | 除了a、b或c的任何字符(否認) |
[a-zA-Z] | a到z或A到Z的任何字符(範圍) |
[abc[hij]] | a、b、c、h、i或j,等效於a|b|c|h|i|j(並集) |
[a-z&&[hij]] | h、i或j(交集) |
並集和交集的應用示例以下:字符串
[a-c[h-j]]table
a到c或h到j的任何字符(並)test
[a-z&&[^hij]]擴展
a到z,除了h、i、j(減去),等效於[a-gk-z]搜索
[a-z&&[^h-j]]引用
a到z,而非h到j(減去),等效於[a-gk-z]
預約義字符集能夠用在方括號以內或以外。
例如\s\d匹配一個空白符後面緊跟一個數字;[\s\d]匹配單個空白符或數字。
構造 | 匹配 |
\d | 數字:[0-9] |
\D | 非數字:[^0-9] |
\s | 空白字符:空格、製表、回車、換行、換頁 |
\S | 非空白字符:[^\s] |
\w | 單詞字符:[a-zA-Z_0-9] |
\W | 非單詞字符:[^\w] |
構造 | 匹配 |
^ | 輸入序列的開始 當啓用多行模式後,還能夠匹配行的開始 |
$ | 輸入序列的結尾 當啓用多行模式後,還能夠匹配行的結尾 |
\b | 單詞邊界
|
\B | 非單詞邊界:[^\b] \B匹配的位置是兩個「單詞字符」之間或兩個「非單詞字符」之間的位置 |
\G | 上一個匹配的結尾 |
構造 | 匹配 |
XY | X後跟Y |
X|Y | X或Y 匹配分支條件時,將會從左到右地測試每一個條件,若是知足了某個分支的話,就不會去再管其它的條件了。例如\d{5}|\d{5}-\d{4},只會匹配5位數字以及9位數字的前5位 |
(X) | 捕獲組(capturing group)。能夠在表達式中用\i引用第i個捕獲組 |
量詞描述了一個模式吸取輸入文本的模式。
貪婪型:量詞老是貪婪的,除非有其它的選項被設置。貪婪表達式會爲全部可能的模式發現儘量多的匹配。
懶惰型:懶惰型表達式匹配知足模式所需的最少字符數。
佔有型:目前,佔有型量詞只在Java語言中可用。當正則表達式被應用於字符串時,它會產生至關多的狀態,以便在匹配失敗時能夠回溯。而佔有型量詞並不保存這些中間狀態,所以它能夠防止回溯。它們經常用來防止正則表達式失控,所以可使正則表達式執行起來更有效。
貪婪型 | 懶惰型 | 佔有型 | 如何匹配 |
X? | X?? | X?+ | 0次或1次X(等效於X{0,1}) 事實上表示前導字符是可選的 |
X* | X*? | X*+ | 0次或屢次X(等效於X{0,} ) 事實上表示前導字符能夠出現任意次數 |
X+ | X+? | X++ | 1次或屢次X(等效於X{1,} ) 事實上表示前導字符至少重現1次 |
X{n} | X{n}? | X{n}+ | 剛好n次X |
X{n,} | X{n,}? | X{n,}+ | 至少n次X |
X{n,m} | X{n,m}? | X{n,m}+ | X至少n次,且不超過m次 |
量詞的貪婪性
量詞?+*會致使正則表達式引擎儘量的重複前導字符。只有當這種重複會引發整個正則表達式匹配失敗的狀況下,引擎會進行回溯。也就是說,它會放棄最後一次的「重複」,而後處理正則表達式餘下的部分。
例如,用一個正則表達式匹配一個HTML標籤。
輸入字符串爲」This is a <EM>first</EM> test」,正則表達式<.+>返回」<EM>first</EM>」。這是由於+是貪婪性的。
讓咱們來看看正則引擎的處理過程。
正則表達式的第一個符號是「<」,這是一個字符;第二個符號是「.」,匹配了字符「E」;第三個符號是「+」,它能夠一直能夠匹配後面的字符,直到一行的結束;而後遇到了換行符,匹配失敗(「.」不匹配換行符)。因而引擎開始對下一個正則表達式符號進行匹配,也即試圖匹配「>」。到目前爲止,正則表達式「<.+」已經匹配了「<EM>first</EM> test」。引擎會試圖將「>」與換行符進行匹配,結果失敗了。因而引擎進行回溯,「<.+」匹配「<EM>first</EM> tes」,因而引擎將「>」與「t」進行匹配,顯然仍是會失敗。這個過程繼續,直到「<.+」匹配「<EM>first</EM」,「>」與「>」匹配。最後引擎找到了一個匹配的部分「<EM>first</EM>」。
由於正則導向的引擎是「急切的」,因此它會急着報告它找到的第一個匹配。而不是繼續回溯,即便可能會有更好的匹配,例如「<EM>」。因此因爲「+」的貪婪性,使得引擎返回了一個最長的匹配。
可使用下列方式來解決量詞的貪婪性帶來的問題。
用懶惰性取代貪婪性。
輸入字符串爲」This is a <EM>first</EM> test」,正則表達式<.+?>返回」<EM>」。
讓咱們再來看看正則引擎的處理過程。
正則表達式符號「<」會匹配素如字符串的第一個「<」。下一個正則符號是「.」。此次是一個懶惰的「+?」來重複上一個字符,它會盡量少的重複上一個字符。所以引擎匹配「.」和字符「E」,而後用「>」匹配「M」,結果失敗了。引擎會進行回溯,和上一個例子不一樣,由於是惰性重複,因此引擎是擴展惰性重複而不是減小;因而「<.+」如今被擴展爲「<EM」。引擎繼續匹配下一個符號「>」。此次獲得了一個成功匹配。引擎因而報告「<EM>」是一個成功的匹配。
惰性擴展的一個替代方案。
輸入字符串爲」This is a <EM>first</EM> test」,正則表達式<[^>]+>返回」<EM>」。
這是一個更好的替代方案。能夠用一個貪婪重複與一個取反字符集<[^>]+>。之因此說這是一個更好的方案在於使用惰性重複時,引擎會在找到一個成功匹配前對每個字符進行回溯。而使用取反字符集則不須要進行回溯。