Regular Expression 使用單個字符串來描述、匹配一系列符合某個句法規則
的字符串。
按某種規則
去匹配符合條件的字符串。不一樣編程語言的正則表達式略有不一樣。javascript
圖形工具(正則表達式在線工具):http://regexper.comjava
JavaScript經過內置對象 RegExp 支持正則表達式,有兩種方法實例化RegExp對象:字面量和構造函數。git
// 實例化一個正則表達式,匹配字符串中的is單詞 var reg = /\bis\b/g; 'She is girl, This is a computer.'.replace(reg, 'IS'); // 結果 'She IS girl, This IS a computer.'
var reg = new RegExp('\\bis\\b', 'g'); 'She is girl, This is a computer.'.replace(reg, 'IS'); // 結果 'She IS girl, This IS a computer.'
正則表達式由兩種基本字符類型組成:原義文本字符和元字符。元字符
是在正則表達式中有特殊含義
的非字母
字符。github
* + $ ^ . | \ () {} []
字符 | 含義 | 字符 | 含義 |
---|---|---|---|
\t |
水平製表符 | \v |
垂直製表符 |
\n |
換行符 | \r |
回車符 |
\0 |
空字符 | \f |
換頁符 |
\cX |
與X對應的控制字符(ctrl+X) |
匹配單個字符
通常狀況下正則表達式一個字符對應字符串一個字符,表達式ab\t
的含義是'ab' + table鍵正則表達式
匹配一類字符[]
可使用元字符[]
來構建一個簡單的類。所謂類
就是指符合某些特性的對象,一個泛指,而不是特指某個字符。
表達式[abc]
把字符a或b或c歸爲一類,表達式能夠匹配這類的字符,便可以匹配a或b或c中的任一個。編程
'a1b2c3d4'.replace(/[abc]/g, 'X'); // 結果:'X1X2X3d4'
字符類取反 數組
使用元字符^
建立 反向類/負向類。反向類的意思是不屬於某類的內容。
表達式[^abc]
表示不是字符a或b或c的內容bash
'a1b2c3d4'.replace(/[^abc]/g, 'X'); // 結果:'aXbXcXXX'
使用[a-z]
來鏈接兩個字符表示從a到z的任意字符
,這是一個閉區間,也就是包含a和z自己。編程語言
'a1b2c3D4'.replace(/[a-zA-Z]/g, 'X'); // 結果:'X1X2X3X4' // 匹配數字 '2017-05-01'.replace(/[0-9]/g, 'X'); // 結果:'XXXX-XX-XX' // 匹配橫線 '2017-05-01'.replace(/[0-9-]/g, 'X'); // 結果:'XXXXXXXXXX'
字符 | 等價類 | 含義 |
---|---|---|
. |
[^\r\n] |
除回車符和換行符以外的全部字符 |
\d |
[0-9] |
數字字符 |
\D |
[^0-9] |
非數字字符 |
\s |
[\t\n\xOB\f\r] |
空白符 |
\S |
[^\t\n\xOB\f\r] |
非空白符 |
\w |
[a-zA-Z_0-9] |
單詞字符(字母、數字、下劃線) |
\W |
[^a-zA-Z_0-9] |
非單詞字符 |
匹配一個ab + 數字 + 任意字符
的字符串函數
ab\d.
幾個常見的邊界匹配字符
字符 | 含義 | 字符 | 含義 |
---|---|---|---|
^ |
以xxx開始 | $ |
以xxx結束 |
\b |
單詞邊界 | \B |
非單詞邊界 |
注意:^
符號不在中括號[]內,則表示以xxx開始,而非取反的意思。
'@123@abc@'.replace(/@./g, 'X'); // 'X23Xbc@' '@123@abc@'.replace(/^@./g, 'X'); // 'X23@abc@' '@123@abc@'.replace(/.@/g, 'X'); // '@12XabX'
字符 | 含義 |
---|---|
? | 出現零次或一次(最多出現一次) |
+ | 出現一次或屢次(至少出現一次) |
* | 出現零次或屢次(任意次) |
{n} | 出現n次 |
{n, m} | 出現n到m次 |
{n,} | 至少出現n次 |
儘量多的匹配。
'123456789'.replace(/\d{3,6}/, 'X'); // X789
儘量少的匹配,也就是說一旦成功匹配就再也不繼續嘗試。方法:在量詞後面加上 ?
便可。
'123456789'.match(/\d{3,6}?/g); // ['123', '456', '789']
使用()
能夠達到分組
的功能,使量詞做用於分組
// 匹配字符串 'Byron' 連續出現3次的場景。 Byron{3} // 匹配'n'連續出現了3次的場景 (Byron){3} // 匹配'Byron'連續出現了3次的場景
// 匹配字母+數字連續出現3次的場景 'a1b2c3d4'.replace(/[a-z]\d{3}/g, 'X'); // a1b2c3d4 'a1b2c3d4'.replace(/([a-z]\d){3}/g, 'X'); // Xd4
使用 |
能夠達到或
的效果
'ByronCasper'.replace(/Byron|Casper/g, 'X'); // XX 'ByronsperByrCasper'.replace(/Byr(on|Ca)sper/g, 'X'); // XX
// 實現:2017-05-01 => 05/01/2017 '2017-05-01'.replace(/(\d{4})-(\d{2})-(\d{2})/g, '$2/$3/$1'); // 05/01/2017
不但願捕獲某些分組,只需在分組內加上?:
便可。
(?:Byron).(ok)
正則表達式從文本頭部向尾部開始解析,文本尾部方向,稱爲前
。 前瞻
就是在正則表達式匹配到規則的時候,向前檢查是否符合斷言,後顧/後瞻方向相反。
JavaScript不支持後顧。
符合與不符合特定斷言稱爲確定/正向
匹配和否認/負向
匹配。
名稱 | 正則 | 備註 |
---|---|---|
正向前瞻 | exp(?=assert) | |
負向前瞻 | exp(?!assert) | |
正向後顧 | exp(?<=assert) | JavaScript不支持 |
負向後顧 | exp(?<!assert) | JavaScript不支持 |
\w(?=\d)
'a2*34v8' .repalce(/\w(?=\d)/g, 'X'); // X2*X4X8 'a2*34vv' .repalce(/\w(?!\d)/g, 'X'); // aX*3XXX
字符 | 含義 | 默認值 |
---|---|---|
g | global 全文搜索,不添加則搜索到第一個匹配中止 | flase |
i | ignore case 忽略大小寫,默認大小寫敏感 | flase |
m | multiple lines 多行搜索 | flase |
l | lastIndex 當前表達式匹配內容的最後一個字符的下一個位置 | |
s | source 正則表達式的文本字符串 |
var mulStr = ' @123 @456 @789 '; mulStr.replace(/^@\d/g, 'X'); // 'X23 // @456 // @789' mulStr.replace(/^@\d/gm, 'X'); // 'X23 // X56 // X89'
test() 方法用於檢測一個字符串是否匹配某個模式。
RegExpObject.test(string);
string
必需。要檢測的字符串。
返回值
若是字符串 string 中含有與 RegExpObject 匹配的文本,則返回 true,不然返回 false。
說明
調用 RegExp 對象 r 的 test() 方法,併爲它傳遞字符串 s,與這個表示式是等價的:(r.exec(s) != null)。
使用正則表達式模式對字符串執行搜索,並將更新全局RegExp對象的屬性以反映匹配結果
// exec() 方法用於檢索字符串中的正則表達式的匹配。 RegExpObject.exec(string)
返回值
返回一個數組,其中存放匹配的結果。若是未找到匹配,則返回值爲 null。
說明
exec() 方法的功能很是強大,它是一個通用的方法,並且使用起來也比 test() 方法以及支持正則表達式的 String 對象的方法更爲複雜。
若是 exec() 找到了匹配的文本,則返回一個結果數組。不然,返回 null。此數組的第 0 個元素是與正則表達式相匹配的文本,第 1 個元素是與 RegExpObject 的第 1 個子表達式相匹配的文本(若是有的話),第 2 個元素是與 RegExpObject 的第 2 個子表達式相匹配的文本(若是有的話),以此類推。除了數組元素和 length 屬性以外,exec() 方法還返回兩個屬性。index 屬性聲明的是匹配文本的第一個字符的位置。input 屬性則存放的是被檢索的字符串 string。咱們能夠看得出,在調用非全局的 RegExp 對象的 exec() 方法時,返回的數組與調用方法 String.match() 返回的數組是相同的。
可是,當 RegExpObject 是一個全局正則表達式時,exec() 的行爲就稍微複雜一些。它會在 RegExpObject 的 lastIndex 屬性指定的字符處開始檢索字符串 string。當 exec() 找到了與表達式相匹配的文本時,在匹配後,它將把 RegExpObject 的 lastIndex 屬性設置爲匹配文本的最後一個字符的下一個位置。這就是說,您能夠經過反覆調用 exec() 方法來遍歷字符串中的全部匹配文本。當 exec() 再也找不到匹配的文本時,它將返回 null,並把 lastIndex 屬性重置爲 0。
方法 | 描述 |
---|---|
search | 檢索與正則表達式相匹配的值。 |
match | 找到一個或多個正則表達式的匹配。 |
replace | 替換與正則表達式匹配的子串。 |
split | 把字符串分割爲字符串數組。 |
w3school文檔: http://www.w3school.com.cn/js...
imooc視頻: http://www.imooc.com/learn/706