JavaScript正則表達式詳解

一 : 語法規則

  1. RegExp 構造函數建立了一個正則表達式對象,用於將文本與一個模式匹配。
  2. RegExp 由兩個部分組成
 ①pattern(正則表達式的文本)
 ② flags:
g:全局匹配;找到全部匹配,而不是在第一個匹配後中止
i:忽略大小寫
m:多行; 將開始和結束字符(^和$)視爲在多行上工做(也就是分別匹配每一行的開 始和結束(由 \n 或 \r分割),而不僅是隻匹配整個輸入字符串的最開始和最末尾處。
u:Unicode; 將模式視爲Unicode序列點的序列
y:粘性匹配; 僅匹配目標字符串中此正則表達式的lastIndex屬性指示的索引(而且不嘗試從任何後續的索引匹配)
   eg:/^[a-zA-z]+\.[a-zA-z]+\.(cn|com|info|top)/gi 域名匹配。

二: 建立形式(兩種方式)

  1. 字面量 eg: var a = /^1\d{2}-\d{4}-\d{4}/g(電話號碼匹配)
  2. 構造函數 eg: var a = new RegExp( /^1\d{2}-\d{4}-\d{4}/g)

三:表達式中特殊字符的含義(詳細列表)

字符類別(Character Classes)字符含義
.
(點號,小數點) 匹配任意單個字符,可是行結束符除外:\n \r \u2028 或 \u2029。
在字符集中,點( . )失去其特殊含義,並匹配一個字面點( . )。須要注意的是,m 多行(multiline)標誌不會改變點號的表現。所以爲了匹配多行中的字符集,可以使用[^] (固然你不是打算用在舊版本 IE 中),它將會匹配任意字符,包括換行符。
例如,/.y/ 匹配 "yes make my day" 中的 "my" 和 "ay",可是不匹配 "yes"。
\d
匹配任意阿拉伯數字。等價於[0-9]。
例如,/\d/ 或 /[0-9]/ 匹配 "B2 is the suite number." 中的 '2'。
\D
匹配任意一個不是阿拉伯數字的字符。等價於[^0-9]。
例如,/\D/ 或 /[^0-9]/ 匹配 "B2 is the suite number." 中的 'B'。
\w
匹配任意來自基本拉丁字母表中的字母數字字符,還包括下劃線。等價於 [A-Za-z0-9_]。
例如,/\w/ 匹配 "apple" 中的 'a',"$5.28" 中的 '5' 和 "3D" 中的 '3'。
\W
匹配任意不是基本拉丁字母表中單詞(字母數字下劃線)字符的字符。等價於 [^A-Za-z0-9_]。
例如,/\W/ 或 /[^A-Za-z0-9_]/ 匹配 "50%" 中的 '%'。
\s
匹配一個空白符,包括空格、製表符、換頁符、換行符和其餘 Unicode 空格。
等價於 [ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​ \u2005\u2006​\u2007\u2008​\u2009\u200a​\u2028\u2029​​\u202f\u205f​ \u3000]。
例如 /\s\w*/ 匹配 "foo bar" 中的 ' bar'。
\S
匹配一個非空白符。等價於 [^ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​ \u2005\u2006​\u2007\u2008​\u2009\u200a​\u2028\u2029​\u202f\u205f​\u3000]。
例如,/\S\w*/ 匹配 "foo bar" 中的 'foo'。
\t匹配一個水平製表符(tab)\r匹配一個回車符(carriage return)\n匹配一個換行符(linefeed)\v匹配一個垂直製表符(vertical tab)\f匹配一個換頁符(form-feed)[\b]匹配一個退格符(backspace)(不要與 \b 混淆)\0匹配一個 NUL 字符。不要在此後面跟小數點。\cX
X 是 A - Z 的一個字母。匹配字符串中的一個控制字符。
例如,/\cM/ 匹配字符串中的 control-M。
\xhh匹配編碼爲 hh (兩個十六進制數字)的字符。\uhhhh匹配 Unicode 值爲 hhhh (四個十六進制數字)的字符。\
對於那些一般被認爲字面意義的字符來講,表示下一個字符具備特殊用處,而且不會被按照字面意義解釋。
例如 /b/ 匹配字符 'b'。在 b 前面加上一個反斜槓,即便用 /\b/,則該字符變得特殊,覺得這匹配一個單詞邊界。
對於那些一般特殊對待的字符,表示下一個字符不具備特殊用途,會被按照字面意義解釋。
例如,* 是一個特殊字符,表示匹配某個字符 0 或屢次,如 /a*/ 意味着 0 或多個 "a"。 爲了匹配字面意義上的 * ,在它前面加上一個反斜槓,例如,/a\*/匹配 'a*'。
字符集合(Character Sets)字符含義[xyz]
一個字符集合,也叫字符組。匹配集合中的任意一個字符。你能夠使用連字符'-'指定一個範圍。
例如,[abcd] 等價於 [a-d],匹配"brisket"中的'b'和"chop"中的'c'。
[^xyz]
一個反義或補充字符集,也叫反義字符組。也就是說,它匹配任意不在括號內的字符。你也能夠經過使用連字符 '-' 指定一個範圍內的字符。
例如,[^abc] 等價於 [^a-c]。 第一個匹配的是 "bacon" 中的'o' 和 "chop" 中的 'h'。
邊界(Boundaries)字符含義^
匹配輸入開始。若是多行(multiline)標誌被設爲 true,該字符也會匹配一個斷行(line break)符後的開始處。
例如,/^A/ 不匹配 "an A" 中的 "A",但匹配 "An A" 中的 "A"。
$
匹配輸入結尾。若是多行(multiline)標誌被設爲 true,該字符也會匹配一個斷行(line break)符的前的結尾處。
例如,/t$/ 不匹配 "eater" 中的 "t",但匹配 "eat" 中的 "t"。
\b
匹配一個零寬單詞邊界(zero-width word boundary),如一個字母與一個空格之間。 (不要和 [\b] 混淆)
例如,/\bno/ 匹配 "at noon" 中的 "no",/ly\b/ 匹配 "possibly yesterday." 中的 "ly"。
\B
匹配一個零寬非單詞邊界(zero-width non-word boundary),如兩個字母之間或兩個空格之間。
例如,/\Bon/ 匹配 "at noon" 中的 "on",/ye\B/ 匹配 "possibly yesterday." 中的 "ye"。
分組(Grouping)與反向引用(back references)字符含義(x)
匹配 x 而且捕獲匹配項。 這被稱爲捕獲括號(capturing parentheses)。
例如,/(foo)/ 匹配且捕獲 "foo bar." 中的 "foo"。被匹配的子字符串能夠在結果數組的元素 [1], ..., [n] 中找到,或在被定義的 RegExp 對象的屬性 $1, ..., $9 中找到。
捕獲組(Capturing groups)有性能懲罰。若是不需再次訪問被匹配的子字符串,最好使用非捕獲括號(non-capturing parentheses),見下面。
\n
n 是一個正整數。一個反向引用(back reference),指向正則表達式中第 n 個括號(從左開始數)中匹配的子字符串。
例如,/apple(,)\sorange\1/ 匹配 "apple, orange, cherry, peach." 中的 "apple,orange,"。一個更全面的例子在該表格下面。
(?:x)匹配 x 不會捕獲匹配項。這被稱爲非捕獲括號(non-capturing parentheses)。匹配項不可以從結果數組的元素 [1], ..., [n] 或已被定義的 RegExp 對象的屬性 $1, ..., $9 再次訪問到。數量詞(Quantifiers)字符含義x*
匹配前面的模式 x 0 或屢次。
例如,/bo*/ 匹配 "A ghost booooed" 中的 "boooo","A bird warbled" 中的 "b",可是不匹配 "A goat grunted"。
x+
匹配前面的模式 x 1 或屢次。等價於 {1,}。
例如,/a+/ 匹配 "candy" 中的 "a","caaaaaaandy" 中全部的 "a"。
x*?
x+?
像上面的 * 和 + 同樣匹配前面的模式 x,然而匹配是最小可能匹配。
例如,/".*?"/ 匹配 '"foo" "bar"' 中的 '"foo"',而 * 後面沒有 ? 時匹配 '"foo" "bar"'。
x?
匹配前面的模式 x 0 或 1 次。
例如,/e?le?/ 匹配 "angel" 中的 "el","angle" 中的 "le"。
若是在數量詞 *、+、? 或 {}, 任意一個後面緊跟該符號(?),會使數量詞變爲非貪婪( non-greedy) ,即匹配次數最小化。反之,默認狀況下,是貪婪的(greedy),即匹配次數最大化。
在使用於向前斷言(lookahead assertions)時,見該表格中 (?=)、(?!) 和 (?:) 的說明。
x(?=y)只有當x 後面緊跟着 y 時,才匹配x。 例如,/Jack(?=Sprat)/ 只有在 'Jack' 後面緊跟着 'Sprat' 時,纔會匹配它。/Jack(?=Sprat|Frost)/ 只有在 'Jack' 後面緊跟着 'Sprat' 或 'Frost' 時,纔會匹配它。然而,'Sprat' 或 'Frost' 都不是匹配結果的一部分。x(?!y)
只有當 x 後面不是緊跟着 y 時,才匹配 x。例如,/\d+(?!\.)/ 只有當一個數字後面沒有緊跟着一個小數點時,纔會匹配該數字。
/\d+(?!\.)/.exec("3.141") 匹配 141 而不是 3.141。
x|y
匹配 x 或 y
例如,/green|red/ 匹配 "green apple" 中的 ‘green',"red apple." 中的 'red'。
x{n}
n 是一個正整數。前面的模式 x 連續出現 n 次時匹配。
例如,/a{2}/ 不匹配 "candy," 中的 "a",可是匹配 "caandy," 中的兩個 "a",且匹配 "caaandy." 中的前兩個 "a"。
x{n,}
n 是一個正整數。前面的模式 x 連續出現至少 n 次時匹配。
例如,/a{2,}/ 不匹配 "candy" 中的 "a",可是匹配 "caandy" 和 "caaaaaaandy." 中全部的 "a"。
x{n,m}
n 和 m 爲正整數。前面的模式 x 連續出現至少 n 次,至多 m 次時匹配。
例如,/a{1,3}/ 不匹配 "cndy",匹配 "candy," 中的 "a","caandy," 中的兩個 "a",匹配 "caaaaaaandy" 中的前面三個 "a"。注意,當匹配 "caaaaaaandy" 時,即便原始字符串擁有更多的 "a",匹配項也是 "aaa"。
斷言(Assertions)字符含義x(?=y)
僅匹配被y跟隨的x。
舉個例子,/Jack(?=Sprat)/,若是"Jack"後面跟着sprat,則匹配之。
/Jack(?=Sprat|Frost)/ ,若是"Jack"後面跟着"Sprat"或者"Frost",則匹配之。可是,"Sprat" 和"Frost" 都不會在匹配結果中出現。
x(?!y)
僅匹配不被y跟隨的x。
舉個例子,/\d+(?!\.)/ 只會匹配不被點(.)跟隨的數字。 /\d+(?!\.)/.exec('3.141') 匹配"141",而不是"3.141

四 : 正則對象的屬性和內置方法

  1. 屬性
  •  注意,RegExp 對象的幾個屬性既有完整的長屬性名,也有對應的類 Perl 的短屬性名。兩個屬性都有着一樣的值。JavaScript 的正則語法就是基於 Perl 的。
  RegExp.prototype.constructor
建立該正則對象的構造函數。
  是否開啓全局匹配,也就是匹配目標字符串中全部可能的匹配項,而不是隻進行第一次匹配。
  在匹配字符串時是否要忽略字符的大小寫。
  下次匹配開始的字符串索引位置。
  是否開啓多行模式匹配(影響 ^ 和 $ 的行爲)。
  正則對象的源模式文本。
  是否開啓粘滯匹配。
RegExp.length
RegExp.length 值爲 2。
2. 方法
  在目標字符串中執行一次正則匹配操做。
  測試當前正則是否能匹配目標字符串。
  返回一個字符串,其值爲該正則對象的字面量形式。覆蓋了Object.prototype.toSource 方法.
  返回一個字符串,其值爲該正則對象的字面量形式。覆蓋了

四 : 正則實例

  1:郵箱匹配:/^([a-zA-Z]|\d)*@[a-zA-Z]+\.[a-zA-Z]+$/gi
  2:手機號碼: /^1\d{2}-\d{4}-\d{4}$/g
  3:連接:/^(http|https):\\\\[a-zA-Z]+\.([a-zA-Z]|\d)+\.(cn|com):\d*\\.*$/g
  4:日期格式 :/^\d{4}-\d{1,2}-\d{1,2}$/g
  5:強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間):/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$/
相關文章
相關標籤/搜索