正則表達式
正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱爲"元字符")。
正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。
經過使用正則表達式,能夠:javascript
- 測試字符串內的模式。
例如,能夠測試輸入字符串,以查看字符串內是否出現電話號碼模式或信用卡號碼模式。這稱爲數據驗證。
- 替換文本。
可使用正則表達式來識別文檔中的特定文本,徹底刪除該文本或者用其餘文本替換它。
- 基於模式匹配從字符串中提取子字符串。
能夠查找文檔內或輸入域內特定的文本。
目前,正則表達式已經在不少軟件中獲得普遍的應用,包括 *nix(Linux, Unix等)、HP 等操做系統,PHP、C#、Java 等開發環境,以及不少的應用軟件中,均可以看到正則表達式的影子。java
特殊字符(稱爲"元字符")
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),能夠用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。
構造正則表達式的方法和建立數學表達式的方法同樣。也就是用多種元字符與運算符能夠將小的表達式結合在一塊兒來建立更大的表達式。正則表達式的組件能夠是單個的字符、字符集合、字符範圍、字符間的選擇或者全部這些組件的任意組合。
正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱爲"元字符")組成的文字模式。模式描述在搜索文本時要匹配的一個或多個字符串。正則表達式做爲一個模板,將某個字符模式與所搜索的字符串進行匹配。正則表達式
而每每正則的使用,那些元字符纔是最爲重要的部分,可是元字符真的很多,因此想要強記真的不容易,可是仍是有一些使用場景較多的須要注意;express
-
字符類別數組
- \ 反斜槓
將下一個字符標記爲一個特殊字符、或一個原義字符、或一個 向後引用、或一個八進制轉義符。例如,'n' 匹配字符 "n"。'n' 匹配一個換行符。序列 '\' 匹配 "" 而 "(" 則匹配 "("。
- . 點號,
匹配任意單個字符, 可是行結束符除外:n r u2028 或 u2029。
- \d
匹配任一阿拉伯數字,等價於[0-9]
- \D
匹配任意一個不是阿拉伯數字的字符。等價於
- \w
匹配任意來自基本拉丁字母表中的字母數字字符,還包括下劃線。等價於 [A-Za-z0-9_]。
- \W
匹配任意不是基本拉丁字母表中單詞(字母數字下劃線)字符的字符。等價於 。
- \s
匹配一個空白符,包括空格、製表符、換頁符、換行符和其餘 Unicode 空格。 等價於 [ fnrtvu00a0u1680u180eu2000u2001u2002u2003u2004 u2005u2006u2007u2008u2009u200au2028u2029u202fu205f u3000]。
- [\b]
匹配一個退格符(backspace)(不要與\b 邊界匹配混淆)
- \S
匹配一個非空白符
- \uhhhh
匹配 Unicode 值爲 hhhh (四個十六進制數字)的字符。
-
字符集合app
- [xyz]
一個字符集合,也叫字符組。匹配集合中的任意一個字符。你可使用連字符'-'指定一個範圍。
- [^xyz]
一個反義或補充字符集,也叫反義字符組。也就是說,它匹配任意不在括號內的字符。你也能夠經過使用連字符 '-' 指定一個範圍內的字符。
-
邊界函數
- ^
匹配輸入開始。若是多行(multiline)標誌被設爲 true,該字符也會匹配一個斷行(line break)符後的開始處。
- $
匹配輸入結尾。若是多行(multiline)標誌被設爲 true,該字符也會匹配一個斷行(line break)符的前的結尾處。
- \b
匹配一個零寬單詞邊界(zero-width word boundary),如一個字母與一個空格之間。 (不要和 [b] 混淆)
- \B
匹配一個零寬非單詞邊界(zero-width non-word boundary),如兩個字母之間或兩個空格之間。
-
分組(grouping)與反向引用(back references)性能
- (x) 括號包括內容
匹配 x 而且捕獲匹配項。 這被稱爲捕獲括號(capturing parentheses)。例如,/(foo)/ 匹配且捕獲 "foo bar." 中的 "foo"。被匹配的子字符串能夠在結果數組的元素 [1], ..., [n] 中找到,或在被定義的 RegExp 對象的屬性 $1, ..., $9 中找到。捕獲組(Capturing groups)有性能懲罰。若是不需再次訪問被匹配的子字符串,最好使用非捕獲括號(non-capturing parentheses),見下面的(?:x)。
- \n
其中n 是一個正整數。一個反向引用(back reference),指向正則表達式中第 n 個括號(從左開始數)中匹配的子字符串。例如,/apple(,)sorange1/ 匹配 "apple, orange, cherry, peach." 中的 "apple,orange,"。一個更全面的例子在該表格下面。
- (?:x)
匹配 x 不會捕獲匹配項。這被稱爲非捕獲括號(non-capturing parentheses)。匹配項不可以從結果數組的元素 [1], ..., [n] 或已被定義的 RegExp 對象的屬性 $1, ..., $9 再次訪問到。
-
數量詞(Quantifiers)測試
- x*
匹配前面的模式 x 0 或屢次。
- x+
匹配前面的模式 x 1 或屢次。等價於 {1,}。
- x*? x+?
像上面的 * 和 + 同樣匹配前面的模式 x,然而匹配是最小可能匹配。這是非貪婪匹配的寫法,主要是在量詞(* +)後面添加?來非貪婪匹配
- x?
匹配前面的模式 x 0 或 1 次。
- x(?=y)
只有當 x 後面緊跟着 y 時,才匹配 x【其中y是不算匹配結果的】。 例如,/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
- x{n}
- 是一個正整數。前面的模式 x 連續出現 n 次時匹配。
- 是一個正整數。前面的模式 x 連續出現至少 n 次時匹配。
- 和 m 爲正整數。前面的模式 x 連續出現至少 n 次,至多 m 次時匹配。
-
斷言(Assertions)spa
- 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"
javascript的正則表達式對象
正則表達式是用於匹配字符串中字符組合的模式。在 JavaScript中,正則表達式也是對象。這些模式被用於 RegExp 的 exec 和 test 方法, 以及 String 的 match、replace、search 和 split 方法。本章介紹 JavaScript正則表達式。
構建
var patt=new RegExp(pattern,modifiers);
或者更簡單的方式:
var patt=/pattern/modifiers;
//pattern(模式) 描述了表達式的模式
//modifiers(修飾符) 用於指定全局匹配g、區分大小寫i的匹配和多行匹配m、Unicode序列u、粘性匹配y
有兩種方法來建立一個RegExp對象:一是字面量、二是構造函數。要指示字符串,字面量的參數不使用引號,而構造函數的參數使用引號
當使用構造函數創造正則對象時,須要常規的字符轉義規則(在前面加反斜槓 ),下面兩個等價
var re = new RegExp("\\w+");
var re = /\w+/;
屬性
- RegExp.length 值爲2
- RegExp.prototype.global
是否開啓全局匹配,也就是匹配目標字符串中全部可能的匹配項,而不是隻進行第一次匹配。
- RegExp.prototype.ignoreCase
在匹配字符串時是否要忽略字符的大小寫。
- RegExp.prototype.lastIndex
下次匹配開始的字符串索引位置。
- RegExp.prototype.multiline
是否開啓多行模式匹配(影響 ^ 和 $ 的行爲)。
- RegExp.prototype.source
正則對象的源模式文本。
- RegExp.prototype.sticky
是否開啓粘滯匹配。
方法
1. RegExp.prototype.exec(str)
在目標字符串中執行一次正則匹配操做。若是匹配成功,exec() 方法返回一個數組,並更新正則表達式對象的屬性。返回的數組將徹底匹配成功的文本做爲第一項,將正則括號裏匹配成功的做爲數組填充到後面。若是匹配失敗,exec() 方法返回 null。
當正則表達式使用 "g" 標誌時,能夠屢次執行 exec 方法來查找同一個字符串中的成功匹配。當你這樣作時,查找將從正則表達式的 lastIndex 屬性指定的位置開始。(test() 也會更新 lastIndex 屬性)
var myRe = /ab*/g;
var str = 'abbcdefabh';
var myArray;
while ((myArray = myRe.exec(str)) !== null) {
var msg = 'Found ' + myArray[0] + '. ';
msg += 'Next match starts at ' + myRe.lastIndex;
console.log(msg);
}
使用了g表明能夠屢次運行,運行exec返回的結果myArray[0]是匹配的所有字符串,myArray[1], ...[n ] 匹配的是括號中的分組捕獲,myArray是數組,可是還有index屬性,匹配到的字符位於原始字符串的基於0的索引值 ;以及input屬性,匹配的是原始字符串。
myRe.exec()每運行完了一次以後,myRe也會發生變化,主要是屬性lastIndex的變化,下一次運行myRe.exec()均可以從這個更新的lastIndex處開始匹配;
注意:不要把正則表達式字面量(或者RegExp構造器)放在 while 條件表達式裏。因爲每次迭代時 lastIndex的屬性都被重置,若是匹配,將會形成一個死循環。而且要確保使用了'g'標記來進行全局的匹配,不然一樣會形成死循環。
若是你只是爲了判斷是否匹配(true或 false),可使用 RegExp.test() 方法,或者 String.search() 方法。
2. RegExp.prototype.test(str)
測試當前正則是否能匹配目標字符串。test() 方法執行一個檢索,用來查看正則表達式與指定的字符串是否匹配。返回 true 或 false。
/^cwj(god)+/.test('cwjgod'); //true
JavaScript中的string和正則結合使用
String的match、replace、search和split方法均可以使用正則表達式。
match方法
str.match(regexp);
參數:
一個正則表達式對象。若是傳入一個非正則表達式對象,則會隱式地使用 new RegExp(obj) 將其轉換爲一個 RegExp 。若是你未提供任何參數,直接使用 match() ,那麼你會獲得一個包含空字符串的 Array :[""] 。
當參數是一個字符串或一個數字,它會使用new RegExp(obj)來隱式轉換成一個 RegExp。若是它是一個有正號的正數,RegExp() 方法將忽略正號。
返回值:
一個包含了整個匹配結果以及任何括號捕獲的匹配結果的 Array ;若是沒有匹配項,則返回 null 。
若是正則表達式沒有 g 標誌,則 str.match() 會返回和 RegExp.exec() 相同的結果。並且返回的 Array 擁有一個額外的 input 屬性,該屬性包含被解析的原始字符串。另外,還擁有一個 index 屬性,該屬性表示匹配結果在原字符串中的索引(以0開始爲整個匹配,1...n後面就是()括號裏面的子匹配)。
replace方法
這是一個強大的方法,
str.replace(regexp|substr, newSubStr|function)
參數1:如下二選一
- regexp (pattern)
一個RegExp 對象或者其字面量。該正則所匹配的內容會被第二個參數的返回值替換掉。
- substr (pattern)
一個要被 newSubStr 替換的字符串。其被視爲一整個字符串,而不是一個正則表達式。僅僅是第一個匹配會被替換。
參數二:如下二選一
- newSubStr (replacement)
用於替換掉第一個參數在原字符串中的匹配部分的字符串。該字符串中能夠內插一些特殊的變量名。參考下面的使用字符串做爲參數。
- function (replacement)
一個用來建立新子字符串的函數,該函數的返回值將替換掉第一個參數匹配到的結果。參考下面的指定一個函數做爲參數。
在第一個參數是字符串的時候,第二個字符串能夠是字符串或者是函數:
在第一個參數是正則表達式的時候,第二個參數能夠是字符串或者函數
-
第二個參數是字符串
$$ 表明插入一個 "$"。
$& 表明插入匹配的子串。
$` 表明插入當前匹配的子串左邊的內容。
$' 表明插入當前匹配的子串右邊的內容。
$n n 是個小於100的非負整數,那麼$n就表明第 n 個括號匹配的字符串
-
第二個參數是函數
函數的返回值做爲替換字符串,參數以下:
1.參數match是匹配的子字符串
2.參數【p1, p2,...】[$1, $2,...] 表明第n個括號匹配的字符串
3.offset 匹配到的子字符串在原字符串中的偏移量
4.string 被匹配的原字符串。
這個參數順序是固定的,不能跳着寫,也就是說若是你須要offset,那麼必須把第一個參數在的所有匹配match以及全部的()子匹配都列出來在參數中,才能正確的映射到全部參數上
search方法
str.search(regexp)
- 參數
一個正則表達式(regular expression)對象。若是傳入一個非正則表達式對象,則會使用 new RegExp(obj) 隱式地將其轉換爲正則表達式對象。
- 返回值
若是匹配成功,則 search() 返回正則表達式在字符串中首次匹配項的索引。不然,返回 -1。
split方法
str.split([separator[, limit]])
split() 方法使用指定的分隔符字符串將一個String對象分割成字符串數組,以將字符串分隔爲子字符串,以肯定每一個拆分的位置。
兩個參數
- separator
指定表示每一個拆分應發生的點的字符串。separator 能夠是一個字符串或正則表達式。 若是純文本分隔符包含多個字符,則必須找到整個字符串來表示分割點。若是在str中省略或不出現分隔符,則返回的數組包含一個由整個字符串組成的元素。若是分隔符爲空字符串,則將str原字符串中每一個字符的數組形式返回。
- limit
一個整數,限定返回的分割片斷數量。當提供此參數時,split 方法會在指定分隔符的每次出現時分割該字符串,但在限制條目已放入數組時中止。若是在達到指定限制以前達到字符串的末尾,它可能仍然包含少於限制的條目。新數組中不返回剩下的文本。
- 0-9
- A-Za-z0-9_