摘要:是否有標志對返回值有很大影響。參數限制返回值中分割元素數量方法返回一個由替換值替換一些或所有匹配的模式后的新字符串。
文章同步到github
正則在平時工作中用的非常多, 最開始接觸正則的時候感覺這個東東好難記啊,最近把正則的內容整理了一下,寫成以下文章。
先給大家介紹一個在線解析正則的網站,來幫助我們理解正則,特別是復雜的正則表達式,非常好用
http://www.regexper.com
比如/^@[a-zA-Z]d+@$/,解析之后圖形幫助理解如下:
什么是正則正則表達式是用于匹配字符串中字符組合的模式。主要應用于正則對象的test和esec方法,以及字符串的search、split、match、replace中。
創建正則 字面量創建var reg = /pattern/flag;
每個正則表達式都可以帶有一個或多個(也可以不帶)表明正則表達式行為的標志
構造函數創建在js中提供了一個內置構造函數RegExp來創建一個正則對象
var reg = new RegExp(pattern [, flags]);
var reg = /[ab]c/g; // 等價于 var reg = new RegExp("[ab]c", "g");正則表達式中的特殊字符 元字符
元字符是在正則表達式中有特殊含義的非字母字符,js中正則表達式元字符包括:
? + * ^ $ . | ( ) [ ] { }
因為這些字符在正則表達式中具有特殊含義,所以如果要想在字符串中匹配這些字符,就必須對它們進行轉義.
// 匹配字符串中的ac或者bc var reg = /[ab]c/; // 如果要匹配字符串的"[ab]c", 需要對[]進行轉義 var reg = /[ab]c/;
注意:
另外需要注意的是,由于使用構造函數創建正則,pattern參數必須為字符串,所有元字符如果需要在字符串中匹配這個字符,需要進行雙重轉義
var reg = /[ab]c/g; 如果使用構造函數創建正則表達式,應該寫成: var reg = new RegExp("[ab]c", "g");字符集合
我們可以使用[]來構建一個簡單的類[xyz],類指符合某些特性的對象,是一個泛指,并不是指某個字符,表示匹配方括號的中任意字符,對于點(.)和星號(*)這樣的特殊符號在一個字符集中沒有特殊的意義。他們不必進行轉義,不過轉義也是起作用的。
字符 | 含義 |
---|---|
[xyz] | 匹配方括號的中任意字符 |
var reg = /[abc]/g; var reg2 = /[abc.]/g; // 字符集合中的. var reg3 = /[abc.]/g; // 字符集合中轉義的. var str = "a1b2c3"; var str2 = "a1b2c3d."; var res = str.replace(reg, "X"); var res2 = str2.replace(reg2, "X"); var res3 = str3.replace(reg3, "X"); console.log(res); // X1X2X3 console.log(res2); // X1X2X3dX console.log(res3); // X1X2X3dX字符集合取反
字符 | 含義 |
---|---|
[^xyz] | 匹配任何沒有包含在方括號中的字符 |
var reg = /[^abc]/g; var str = "abcdefg"; var res = str.replace(reg, "X"); console.log(res); // abcXXXX范圍類
在字符集合中可以使用(-)來指定一個字符范圍, 如[a-z],表示匹配從a到z的任意字符
var reg = /[a-z]/g; var str = "a1b2c3d4e5F6"; var res = str.replace(reg, "X"); console.log(res); // X1X2X3X4X5F6
在范圍類[]中可以連寫,如同時匹配大小寫,[a-zA-Z]
var reg = /[a-zA-Z]/g; var str = "a1b2c3d4e5F6"; var res = str.replace(reg, "X"); console.log(res); // X1X2X3X4X5X6預定義類
正則表達式提供了預定義類,來匹配常見的字符類,不需要都通過字符集合去定義正則表達式
字符 | 等價類 | 含義 |
---|---|---|
. | [^ ] | 匹配除回車符合換行符之外的任何單個字符 |
d | [0-9] | 數字字符 |
D | [^0-9] | 非數字字符 |
s | [ x0Bf ] | 空白符 |
S | [^ x0Bf ] | 非空白符 |
w | [a-zA-Z_] | 單詞字符(字母、數字、下劃線) |
W | [^a-zA-Z_] | 非單詞字符 |
正則還提供了邊界匹配符
字符 | 含義 |
---|---|
^ | 匹配輸入的開始 |
$ | 匹配輸入的結尾 |
單詞邊界 | |
B | 非單詞邊界 |
// ^的應用 var reg = /^@./g var str = "@123abc@"; var res = str.replace(reg, "X"); console.log(res); // X23abc // $的應用 var reg2 = /^.@$/g; var str2 = "@123abc@"; var res2 = str2.replace(reg2, "X"); console.log(res2); // 123abX // 的應用 var reg3 = /is/g; var str3 = "this is javaScript"; var res3 = str3.replace(reg3, "X"); console.log(res3); // this X javaScript正則的m標志應用
var reg = /^@./g; var str = `@abc @123 @XYZ ` var res = str.replace(reg, "X"); // 因為即使字符串看上去換行,本質上還是一些換行符,只有結尾和結束 console.log(res); // Xbc @123 @XYZ
當正則表達式使用m標志的時候,在一行文本末尾結束的時候,還會去匹配下一行是否存在與模式匹配的項,例子如下:
var reg = /^@./gm; var str = `@abc @123 @XYZ ` var res = str.replace(reg, "X"); console.log(res); // Xbc X23 XYZ量詞
字符 | 含義 |
---|---|
? | 匹配前面一個表達式0次或者1次(至多出現一次) |
+ | 匹配前面一個表達式1次或者多次(至少出現一次) |
* | 匹配前一個表達式0次或多次(任意次) |
{n} | n是一個正整數,匹配了前面一個字符剛好發生了n次 |
{n,m} | n 和 m 都是整數。匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 這個值被忽略。 |
{n,} | 匹配前面字符n此或者更多次(至少出現n次 |
貪婪模式是讓正則表達式盡可能多的匹配
var reg = /d{2,5}/; var str = "12345678"; var res = str.replace(reg, "X"); console.log(res); // X678非貪婪模
非貪婪模式是讓正則表達式盡可能少的匹配,一旦匹配成功不在繼續匹配,做法是在量詞后面加上?即可
var reg = /d{2,5}?/ var str = "12345678"; var res = str.replace(reg, "X"); console.log(res); // X345678分組 使用括號()進行分組
量詞不作用于緊挨著的某個字符,使用/(x)/匹配 "x",并且記住匹配項,括號被稱為補貨括號
var reg = /([a-zA-Z]d)/g; var str = "a1bbc3D4efg"; var res = str.replace(reg, "X"); console.log(res); // XbbXXefg
使用在線解析正則工具如下圖:
另外可以添加量詞
var reg = /(abc){3}/g; var str = "abcabcabcabc"; var res = str.replace(reg, "X"); console.log(res); // Xabc使用或" | "進行分組
var reg = /apple|pear/g var str = "appleappleHpearpear"; var res = str.replace(reg, "X"); console.log(res); // XXHXX var reg2 = /appl(e|p)ear/g; var str2 = "appleearHapplpear" var res2 = str2.replace(reg2, "X"); console.log(res2); // XHX
在線解析上面代碼的reg和reg2如下:
reg:
reg2:
在replace替換環節,可以使用$1、$2、$3...$n等捕獲分匹配到的分組
比如想把"25/12/2016"轉換成"2016-12-25":
var reg = /(d{2})/(d{2})/(d{4})/; var str = "25/12/2016"; var res = str.replace(reg, "$3-$2-$1"); console.log(res); // 2016-12-25忽略分組
如果不希望捕獲分組,只需要在分組內加上(?:)就可以
var reg = /(?:d{2})/(d{2})/(d{4})/; var str = "25/12/2016"; var res = str.replace(reg, "$3-$2-$1"); 此時$2為2016,$1為12,而$3捕獲不到,按普通字符串顯示 console.log(res); // $3-2016-12正向肯定查找
x(?=y)
匹配x,并且x后必須跟著y,這就是正向肯定查找
var reg = /w(?=d)/g; var str = "a1b2ccd4"; var res = str.replace(reg, "X"); console.log(res); // X1X2ccX4正向否定查找
匹配x,并且x后必須不跟著y,這就是正向否定查找
var reg = /[a-z](?!d)/g; var str = "a1b2ccd4"; var res = str.replace(reg, "X"); console.log(res); // a1b2XXd4正則對象屬性和方法 屬性
屬性皆為只讀,不可修改
var reg = /[abc]/; console.log(reg.ignoreCase) // false; console.log(reg.global) // false; console.log(reg.multiline) // false; reg.ignoreCase = true; reg.global = true; reg.multiline = true; console.log(reg.ignoreCase) // false; console.log(reg.global) // false; console.log(reg.multiline) // false;
還是以上代碼看一下source屬性
console.log(reg.source) // [abc]
如果使用構造函數創建正則對象,再來看一下source屬性
var reg = new RegExp("[abc]"); //需要對元字符進行雙重轉義 console.log(reg.source); // [abc]
通過以上對比可知,source屬性是字面量形式創建正則對象所有的字符串
方法 RegExp.prototype.test()test() 方法執行一個檢索,用來查看正則表達式與指定的字符串是否匹配。匹配到返回 true,否則返回false。
語法
regexObj.test(str)
var reg = /w/; var str = "ab"; console.log(reg.test(str)); // true console.log(reg.test(str)); // true console.log(reg.test(str)); // true
注意
當正則表達式使用全局模式時,lastIndex屬性會影響test()方法的返回值,看下面例子
var reg = /w/g; var str = "ab"; console.log(reg.test(str)); // true console.log(reg.test(str)); // true console.log(reg.test(str)); // false console.log(reg.test(str)); // true
為什么會出現這種現象呢,是因為正則表達式執行test方法時,每次都會把結果作用到操作的正則實例上,由于是全局匹配,第一次匹配到之后reg的lastIndex屬性為1,繼續匹配,此時從lastIndex的位置開始匹配,即從b開始,結果又匹配到,此時lastIndex屬性為2,當繼續匹配時,從2開始匹配,沒有匹配到,此時返回false,lastIndex被重置為0,所以第4次執行console.log(reg.test(str))就會從新從0開始,所以返回值為true。結合while循環來說明一下:
var reg = /w/g; var str = "ab"; while(reg.test(str)){ console.log(reg.lastIndex); // 循環執行兩次,分別打印出1, 2 }RegExp.prototype.exec()
exec() 方法在一個指定字符串中執行一個搜索匹配.
語法
regexObj.exec(str)
返回值:
1.如果匹配失敗,返回 null。
2.如果匹配成功,exec() 方法返回一個數組,并更新正則表達式對象的屬性,一般來說主要是lastIndex屬性值的更新。返回的數組將完全匹配成功的文本作為第一項,將正則括號里匹配成功的作為數組填充到后面,返回值雖然是Array實例,但是包含了index和input屬性
index: 表示匹配項在字符串中的位置,也就是匹配項第一個字符的位置
input: 表示應用正則表達式的字符串
返回數組內容包括:
第一個元素是與正則表達式相匹配的文本
第二個元素是與正則對象第一個子表達式相匹配的文本,也就是第一個分組(如果有的話)
第三個元素是與正則對象第二個子表達式相匹配的文本,也就是第而個分組(如果有的話),以此類推
var reg = /d(w)(w)d/; var str = "@1bb2c3dd4f"; var res = reg.exec(str); console.log(reg.lastIndex); // 0 非全局模式忽略lastIndex屬性 console.log(res.index); // 1 console.log(res.input); // @1ab2c3dd4f console.log(res); // ["1ab2", "a", "b"]全局調用
var reg = /d(w)(w)d/g; var str = "@1bb2c3dd4f"; var res = reg.exec(str); console.log(reg.lastIndex); // 5 非全局模式忽略lastIndex屬性 console.log(res.index); // 1 console.log(res.input); // @1ab2c3dd4f console.log(res); // ["1ab2", "a", "b"] console.log(reg.lastIndex);
使用while循環加深一下理解
var reg = /d(w)(w)d/g; var str = "@1bb2c3dd4f"; while(reg.exec(str)) { console.log(reg.lastIndex, res.index, res); // 打印兩次結果分別為 // 5, 1, ["1bb2", "b", "b"] // 10, 6, ["3dd4", "d", "d"] }字符串對象方法 String.prototype.search()
方法執行正則表達式和 String對象之間的一個搜索匹配,如果匹配成功,返回正則表達式在字符串中首次匹配項的索引,否則返回-1。
語法:
str.search(regexp)
如果傳入一個非正則表達式對象,則會使用 new RegExp(obj) 隱式地將其轉換為正則表達式對象。
String.prototype.match()用于搜索字符串,找到一個或多個與regexp匹配的文本
語法:
str.match(regexp);
返回值:
一個包含了整個匹配結果以及任何括號捕獲的匹配結果的 Array ;如果沒有匹配項,則返回 null。regexp是否有g標志對返回值有很大影響。
非全局調用(不包含g標志)返回值和RegExp.prototype.exec()方法一樣,就不細說了。
全局調用(包含g標志)沒有找到任何匹配的字符串,返回null
如果找到了一個或多個匹配的字符串,則返回一個數組,存放字符串中所有匹配的字符串,不包含捕獲內容,也不具有index和input屬性。
var reg = /d(w)d/g; var str = "1a2b3c4d"; var res = str.match(reg); console.log(res); // ["1a2", "3c4"] console.log(res.index); // undefined console.log(res.input); // undefinedString.prototype.split()
split() 方法使用指定的分隔符字符串將一個String對象分割成字符串數組
語法:
str.split([separator[, limit]]);separator 參數
當separator為字符串時,其實也是默認轉成正則去執行
var str = "a, b, c, d"; var arr = str.split(","); var arr2 = str.split(/,/); console.log(arr); // ["a", " b", " c", " d"] console.log(arr2); // ["a", " b", " c", " d"]separator帶捕獲括號
如果 separator 包含捕獲括號(capturing parentheses),則其匹配結果將會包含在返回的數組中。
var str = "a1b2c3d"; var arr = str.split(/(d)/); console.log(arr); // ["a", "1", "b", "2", "c", "3", "d"]limit參數
限制返回值中分割元素數量
var str = "a b c d e"; var arr = str.split(" ", 3); console.log(arr); // ["a", "b", "c"]String.prototype.replace()
replace() 方法返回一個由替換值替換一些或所有匹配的模式后的新字符串。模式可以是一個字符串或者一個正則表達式, 替換值可以是一個字符串或者一個每次匹配都要調用的函數。
注意: 原字符串不會改變。
語法:
str.replace(regexp|substr, newSubStr|function)String.prototype.replace(substr, newSubStr)
var str = "a1b2c3d"; var resStr = str.replace("1", "X"); console.log(resStr); //String.prototype.replace(regexp, newSubStr)
var str = "a1b2c3d"; var resStr = str.replace(/d/g, "X"); console.log(resStr); // aXbXcXdString.prototype.replace(regexp, function)
function會在每次匹配替換的時候調用,包含四個可選參數
匹配到的字符串
正則表達式分組內容,沒有分組就沒有該參數
匹配項在字符串中的index
原字符串
例子:
比如要把"a1b2c3"替換后的結果為"a2b3c4"
var str = "a1b2c3"; var resStr = str.replace(/d/g, function(matchStr, index, originStr) { // 此時正則表達式中無捕獲,function中則無分組參數 return parseInt(matchStr) + 1; }); console.log(resStr); // a2b3c4
當正則表達式中有捕獲時,再看一下另外一個例子:
var str = "a1b2c3d4e"; var resStr = str.replace(/(d)(w)(d)/g, function(matchStr, group1, group2, group3, index, originStr) { // 會執行兩次回調,打印結果分別如下 console.log(matchStr) // 1b2 3d4 console.log(group1); // 1 3 console.log(group2); // b d console.log(group3); // 2 4 return group1 + group3; //把匹配到的文本替換成group1 + group3字符串拼接后的值 }); // 把匹配到的1b2替換成group1 + group3(12), 3d4替換成(34) console.log(resStr); // a12c34e 把匹配到的1b2替換成group1 + group3(12)
以上就是我總結的正則表達式相關知識, 感覺把正則搞清楚還是很爽滴, 如發現有問題請多多指教。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89091.html
摘要:選擇分組和引用正則表達式的語法還包括指定選擇項子表達式分組和引用前一子表達式的特殊字符。帶圓括號的表達式的另一個用途是允許在同一正則表達式的后部引用前面的子表達式。 正則表達式(regular expression)是一個描述字符模式的對象。JavaScript的 RegExp類 表示正則表達式,String和RegExp都定義了方法,后者使用正則表達式進 行強大的模式匹配和文本檢索與...
摘要:正則表達式的意義中的正則表達式使用表示,可以使用構造函數來創建對象,不過對象更多的是通過一種特殊的直接量語法來創建。用構造函數也可以定義一個與之等價的正則表達式,代碼如下正則表達式的模式規則是由一個字符序列組成的。 正則表達式的模式匹配 正則表達式(regular expression)是一個描述字符模式的對象。javascript的RegExp對象表示正則表達式,String和Reg...
Javascript的正則表達式是前端中比較重要的部分,正則表達式主要用于字符串處理,表單驗證等場合,實用高效,文章主要對JavaScript中的正則的學習與總結 正則表達式的定義 正則表達式:是一個描述字符模式的對象,JavaScrip中正則表達式用RegExp對象表示,可以使用RegExp構造函數來創建正則對象 正則表達式的創建 1.字面量創建 var reg = /[a-z]/; 2.構...
摘要:正則表達式的字符串表示,按照字面量形式而非傳入構造函數中的字符串模式返回。其中,表示匹配項在字符串中的位置,而表示應用正則表達式的字符串。下面列出了正則表達式所不支持的特性。關卡按要求完成下列常用的正則表達式。 由于本課程的核心是 JavaScript,所以本文著重講解了「正則表達式」在 JavaScript 中的用法,并未深入「正則表達式」的具體細節。如果您尚不了解「正則表達式」,強...
閱讀 3406·2021-11-25 09:43
閱讀 3464·2021-11-19 09:40
閱讀 2464·2021-10-14 09:48
閱讀 1283·2021-09-09 11:39
閱讀 1920·2019-08-30 15:54
閱讀 2821·2019-08-30 15:44
閱讀 1994·2019-08-29 13:12
閱讀 1543·2019-08-29 12:59