平時js編碼時,對字符串的操做隨處可見。正則表達式即是一種用來匹配字符串的一把利劍。它的設計思想是用一種描述性的語言來給字符串定義一個規則,凡是符合規則的字符串,咱們就認爲它「匹配」了。若是您是一位老司機,那麼正則表達式確定耳熟能詳,可是若是您是剛上車的話,那麼我們就接下來探討探討。正則表達式
主要有下面兩種方式,常常食用的是字面量形式。固然構造函數的更加靈活,能夠根據條件動態生成正則。數組
RegExp對象建立函數
var reg = new RegExp('A+b', g); reg.test('saAb') //true
字面量測試
var reg = /A+b/g; reg.test('saAb') //true
元字符 | 描述 |
---|---|
. | 查找單個字符,除了換行和行結束符。 |
w | 查找單詞字符。 |
W | 查找非單詞字符。 |
d | 查找數字。 |
D | 查找非數字字符。 |
s | 查找空白字符。 |
S | 查找非空白字符。 |
b | 匹配單詞邊界。 |
B | 匹配非單詞邊界。 |
0 | 查找 NUL 字符。 |
n | 查找換行符。 |
f | 查找換頁符。 |
r | 查找回車符。 |
t | 查找製表符。 |
v | 查找垂直製表符。 |
xxx | 查找以八進制數 xxx 規定的字符。 |
xdd | 查找以十六進制數 dd 規定的字符。 |
uxxxx | 查找以十六進制數 xxxx 規定的 Unicode 字符。 |
量詞 | 描述 |
---|---|
n+ | 匹配任何包含至少一個 n 的字符串。 |
n+? | ?開啓懶惰模式,開啓最小匹配 |
n* | 匹配任何包含零個或多個 n 的字符串。 |
n*? | ?開啓懶惰模式,開啓最小匹配 |
n? | 匹配任何包含零個或一個 n 的字符串。 |
n{X} | 匹配包含 X 個 n 的序列的字符串。 |
n{X,Y} | 匹配包含 X 至 Y 個 n 的序列的字符串。 |
n{X,} | 匹配包含至少 X 個 n 的序列的字符串。 |
n$ | 匹配任何結尾爲 n 的字符串。 |
^n | 匹配任何開頭爲 n 的字符串。 |
?=n | 匹配任何其後緊接指定字符串 n 的字符串。舉個例子,/Jack(?=Sprat)/,若是"Jack"後面跟着sprat,則匹配之。 |
?!n | 匹配任何其後沒有緊接指定字符串 n 的字符串。舉個例子,/d+(?!.)/ 只會匹配不被點(.)跟隨的數字。 |
特殊字符 | 描述 | ||
---|---|---|---|
$ | 匹配輸入字符串的結尾位置。若是設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符自己,請使用 $。 | ||
( ) | 標記一個子表達式的開始和結束位置。子表達式能夠獲取供之後使用。要匹配這些字符,請使用 ( 和 )。 | ||
* | 匹配前面的子表達式零次或屢次。要匹配 * 字符,請使用 *。 | ||
+ | 匹配前面的子表達式一次或屢次。要匹配 + 字符,請使用 +。 | ||
. | 匹配除換行符 n 以外的任何單字符。要匹配 . ,請使用 . 。 | ||
[ | 標記一箇中括號表達式的開始。要匹配 [,請使用 [。 | ||
? | 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 ?。 | ||
\ | 將下一個字符標記爲或特殊字符、或原義字符、或向後引用、或八進制轉義符。例如, 'n' 匹配字符 'n'。'n' 匹配換行符。序列 '\' 匹配 "",而 '(' 則匹配 "("。 | ||
^ | 匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時它表示不接受該字符集合。要匹配 ^ 字符自己,請使用 ^。 | ||
{ | 標記限定符表達式的開始。要匹配 {,請使用 {。 | ||
指明兩項之間的一個選擇。要匹配 | ,請使用 \ | 。 |
定位字符 | 描述 |
---|---|
^ | 匹配輸入字符串開始的位置。若是設置了 RegExp 對象的Multiline 屬性,^ 還會與 n 或 r 以後的位置匹配。 |
$ | 匹配輸入字符串結尾的位置。若是設置了 RegExp 對象的 Multiline 屬性,$ 還會與 n 或 r 以前的位置匹配。 |
b | 匹配一個字邊界,即字與空格間的位置。 |
B | 非字邊界匹配。 |
修飾字符 | 描述 |
---|---|
g | 執行全局匹配(查找全部匹配而非在找到第一個匹配後中止)。 |
i | 執行對大小寫不敏感的匹配。 |
m | 執行多行匹配。 |
方括號用於查找某個範圍內的字符:編碼
字符 | 含義 |
---|---|
[xyz] | 一個字符集合,也叫字符組。匹配集合中的任意一個字符。你可使用連字符'-'指定一個範圍。例如,[abcd] 等價於 [a-d],匹配"brisket"中的'b'和"chop"中的'c'。 |
[^xyz] |
一個反義或補充字符集,也叫反義字符組。也就是說,它匹配任意不在括號內的字符。你也能夠經過使用連字符 '-' 指定一個範圍內的字符。例如,1 等價於 2。 第一個匹配的是 "bacon" 中的'o' 和 "chop" 中的 'h'。 |
描述一個正確的IP地址:/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/
。上面便使用了分組功能。.net
一般使用分組的話,匹配子表達式而且會捕獲匹配項。 這被稱爲捕獲括號;有捕獲括號便會有非捕獲括號,下面這種形式便會開啓。(?:x);設計
捕獲表達式的一個用法即是,反向引用。code
對一個正則表達式模式或部分模式兩邊添加圓括號將致使相關匹配存儲到一個臨時緩衝區中,所捕獲的每一個子匹配都按照在正則表達式模式中從左到右出現的順序存儲。緩衝區編號從 1 開始,最多可存儲 99 個捕獲的子表達式。每一個緩衝區均可以使用 n 訪問,其中 n 爲一個標識特定緩衝區的一位或兩位十進制數。regexp
例如: \b(\w+)\b\s+\1\b
便會捕獲相鄰的相同單詞。對象
轉義
若是你想查找元字符自己的話,好比你查找.,或者*,就出現了問題:你沒辦法指定它們,由於它們會被解釋成別的意思。這時你就得使用來取消這些字符的特殊意義。所以,你應該使用.和*。固然,要查找自己,你也得用\\
deerchao\.net匹配deerchao.net,C:\\Windows匹配C:\Windows
注意test的不可重複性
若是 exec() 找到了匹配的文本,則返回一個結果數組。不然,返回 null。此數組的第 0 個元素是與正則表達式相匹配的文本,第 1 個元素是與 RegExpObject 的第 1 個子表達式相匹配的文本(若是有的話),第 2 個元素是與 RegExpObject 的第 2 個子表達式相匹配的文本(若是有的話),以此類推。除了數組元素和 length 屬性以外,exec() 方法還返回兩個屬性。index 屬性聲明的是匹配文本的第一個字符的位置。input 屬性則存放的是被檢索的字符串 string。咱們能夠看得出,在調用非全局的 RegExp 對象的 exec() 方法時,返回的數組與調用方法 String.match() 返回的數組是相同的。
校驗數字的表達式
校驗字符的表達式
[^~\x22]+
特殊需求表達式