摘要:一正則表達(dá)式的定義正則表達(dá)式是一個(gè)描述字符模式的對(duì)象對(duì)象更多的是通過(guò)一種特殊的直接量語(yǔ)法來(lái)創(chuàng)建正則表達(dá)式的模式規(guī)則是由一個(gè)字符序列組成的包括所有字母和數(shù)字在內(nèi)大多數(shù)的字符都是按照直接量?jī)H描述待匹配字符的二直接量字符正則表達(dá)式中的所有字母和數(shù)
一.正則表達(dá)式的定義
1.正則表達(dá)式(regular expression)是一個(gè)描述字符模式的對(duì)象.
2.RegExp對(duì)象更多的是通過(guò)一種特殊的直接量語(yǔ)法來(lái)創(chuàng)建.
var reg = /d/;
3.正則表達(dá)式的模式規(guī)則是由一個(gè)字符序列組成的,包括所有字母和數(shù)字在內(nèi),大多數(shù)的字符都是按照
直接量?jī)H描述待匹配字符的.
1.正則表達(dá)式中的所有字母和數(shù)字都是按照字面含義進(jìn)行匹配的,
也支持非字母的字符匹配,需要通過(guò)反斜杠()作為前綴進(jìn)行轉(zhuǎn)義.比如/n/用以匹配換行符.
var str = "abc12345"; // 直接量字符 var reg = /b/; console.log(str.match(reg)); // ["b", 1]三.字符類(lèi)
1.將直接量字符多帶帶放進(jìn)方括號(hào)內(nèi)就組成了字符類(lèi).
一個(gè)字符類(lèi)可以匹配它所包含的任意字符,/[abc]/就和字母"a","b","c"中的任意一個(gè)都匹配.
2.另外,可以通過(guò)^符號(hào)來(lái)定義否定字符類(lèi),它匹配所有不包含在方括號(hào)內(nèi)的字符.
3.字符類(lèi)可以使用連字符來(lái)表示字符范圍,/[a-z]/,[a-zA-Z0-9].
4.由于某些字符類(lèi)非常常用,因此在js的正則表達(dá)式語(yǔ)法中,使用了這些特殊字符的轉(zhuǎn)義字符來(lái)表示他們.
5.在方括號(hào)內(nèi)也可以寫(xiě)這些特殊轉(zhuǎn)義字符,/[sd]/就匹配任意空白符或者數(shù)字
// 字符類(lèi) var reg = /[bc]/; console.log(str.match(reg)); // ["b", 1] var reg = /[^bc][^bc]/; console.log(str.match(reg)); var reg = /d/g; console.log(reg.test(str)); // true console.log(str.match(reg)); // [1,2,3,4,5]
[...] 方括號(hào)內(nèi)的任意字符
1 不在方括號(hào)內(nèi)的任意字符
. 除換行符和其他Unicode行終止符之外的任意字符
w [a-zA-Z0-9]
W 2
s 任何Unicode空白符
S 任何非Unicode空白符的字符
d [0-9]
D 3
var reg = /s/g; console.log(str.replace(reg, ""));四.重復(fù)
1.這些正則表達(dá)式語(yǔ)法中較為復(fù)雜的模式都提到了正則表達(dá)式中某元素的"重復(fù)出現(xiàn)次數(shù)".
2.我們?cè)谡齽t模式之后跟隨用以指定字符重復(fù)的標(biāo)記.
3.在使用"*"和"?"時(shí)要注意,由于這些字符可能匹配0個(gè)字符,因此他們?cè)试S什么都不匹配.
{n,m} 匹配前一項(xiàng)至少n次,但不能超過(guò)m次
{n,} 匹配前一項(xiàng)n次或者更多次
{n} 匹配前一項(xiàng)n次
? 匹配前一項(xiàng)0次或多次,也即是說(shuō)前一項(xiàng)是可選的,等價(jià)于{0,1}
匹配前一項(xiàng)1次或多次,等價(jià)于{1,}
匹配前一項(xiàng)0次或多次,等價(jià)于{0,}
// 重復(fù) var reg = /d{2}/; console.log(str.match(reg)); // ["12"] var reg = /d{2,}/; console.log(str.match(reg)); // ["12345"] var reg = /d{2,4}/; console.log(str.match(reg)); // ["1234"] //郵箱 [email protected] var str = "[email protected]"; var reg = /w+@w+(.w+)+/; console.log(str.match(reg));四.非貪婪的重復(fù)
1.上面列出的匹配重復(fù)時(shí)盡可能多的匹配,而且允許后續(xù)的正則表達(dá)式繼續(xù)匹配,因此,我們稱之為"貪婪的匹配".
2.我們同樣可以使用正則表達(dá)式進(jìn)行非貪婪匹配,只需在待匹配的字符后跟隨一個(gè)問(wèn)號(hào)即可."??","+?","*?"或"{1,5}+".
3.比如,/a+/可以匹配一個(gè)或多個(gè)連續(xù)的字母a,當(dāng)使用"aaa"作為匹配字符串時(shí),正則表達(dá)式會(huì)匹配它的三個(gè)字符.
但是/a+?也可以匹配一個(gè)或多個(gè)連續(xù)字母a,但是它盡可能少的匹配.
// 非貪婪的匹配 var str = "aaab"; var reg1 = /a+/; var reg2 = /a+?/; console.log(str.match(reg1)); // ["aaa"] console.log(str.match(reg2)); // ["a"]五.選擇,分組和引用
1.正則表達(dá)式的語(yǔ)法還包括指定選擇項(xiàng),子表達(dá)式分組和引用前一子表達(dá)式的特殊字符.
字符"|"用于分隔供選擇的字符,例如/ab|cd|ef/可以匹配字符串"ab",也可以匹配字符串"cd","ef".
2.正則表達(dá)式中的圓括號(hào)有多種作用,一個(gè)作用是把多帶帶的項(xiàng)組合成子表達(dá)式,以便可以像處理一個(gè)獨(dú)立的
單元那樣用"|","*","+","?"等來(lái)對(duì)單元內(nèi)的項(xiàng)進(jìn)行處理.
// 分組,引用 var str = "javascript"; var reg1 = /java(script)?/; console.log(str.match(reg1)); // ["javascript", "script"] var str = "abc123";`` var reg = /w+(d+)/; console.log(str.match(reg)); // ["abc123", "3"]六.指定匹配位置
1.正則表達(dá)式中的多個(gè)元素才能匹配字符串的一個(gè)字符,例如s匹配的只是一個(gè)空白符,
還有一些正則表達(dá)式的元素匹配的是字符之間的位置,而不是實(shí)際的字符,例如b匹配一個(gè)單詞的邊界,即位于w和W之間的邊界.
2.像b這樣的元素不匹配某個(gè)可見(jiàn)的字符,它們指定匹配發(fā)生的合法位置.
有時(shí)我們稱這些元素為正則表達(dá)式的錨,因?yàn)樗麄儗⒛J蕉ㄎ辉谒阉髯址奶囟ㄎ恢蒙?
最常用的錨元素是^,它用來(lái)匹配字符串的開(kāi)始,錨元素$用以匹配字符串的結(jié)束.
^ 匹配字符串的開(kāi)頭,在多行檢索中,匹配一行的開(kāi)頭
$ 匹配字符串的結(jié)尾,在多行檢索中,匹配一行的結(jié)尾
b 匹配一個(gè)單詞的邊界,簡(jiǎn)言之,就是位于字符w和W之間的位置,或位于字符s和字符串的開(kāi)頭或結(jié)尾之間的位置
B 匹配非單詞邊界的位置
// 匹配非單詞邊界 var str1 = "javascript"; var str2 = "scripting"; var reg1 = /script/; var reg2 = /Bscript/; console.log(str1.match(reg1)); // null console.log(str1.match(reg2)); // ["script"] console.log(str2.match(reg1)); // ["script"] console.log(str2.match(reg2)); // null七.修飾符
1.正則表達(dá)式的修飾符,用以說(shuō)明高級(jí)匹配模式的規(guī)則.
"i"用以說(shuō)明模式匹配是不區(qū)分大小寫(xiě)的
"g"說(shuō)明模式匹配應(yīng)該是全局的,也就是說(shuō),應(yīng)該找出被檢索字符串中所有的匹配
// 修飾符 var str = "AAaa"; var reg = /a/; console.log(str.match(reg)); // ["a"] var reg = /a/g; console.log(str.match(reg)); // ["a","a"] var reg = /a/i; console.log(str.match(reg)); // ["A"] var reg = /a/gi; console.log(str.match(reg)); // ["A", "A", "a", "a"]用于模式匹配的String方法
String對(duì)象的一些用以執(zhí)行正則表達(dá)式模式匹配和檢索替換操作的方法
String.search1.search(),他的參數(shù)是一個(gè)正則表達(dá)式,返回一個(gè)與之匹配的字串的起始位置,如果找不到匹配的字串,它將返回-1.
var str = "javascript123"; var reg = /script/i; console.log(str.search(reg)); // 4String.replace
1.replace()方法用以執(zhí)行檢索與替換操作,其中一個(gè)參數(shù)是一個(gè)正則表達(dá)式,第二個(gè)參數(shù)是要進(jìn)行替換的字符串.
如果正則表達(dá)式中設(shè)置了修飾符g,那么源字符串中所有模式匹配的字串都將替換成第二個(gè)參數(shù)指定的字符串,
如果不帶修飾符g,則只替換所匹配的第一個(gè)字串.
2.正則表達(dá)式中使用圓括號(hào)括起來(lái)的子表達(dá)式是帶有從左到右的索引編號(hào)的,而且正則表達(dá)式會(huì)記憶與每個(gè)子表達(dá)式匹配的文本.
如果在替換字符串中出現(xiàn)了$加數(shù)字,那么replace()將用與指定的子表達(dá)式相匹配的文本來(lái)替換這兩個(gè)字符.
3.replace()方法還有一些其他重要特性,第二個(gè)參數(shù)可以是函數(shù),該函數(shù)能夠動(dòng)態(tài)的計(jì)算替換字符串.
var reg = /j(ava)sc(ri)pt/g; console.log(str.replace(reg, "$1")); // "ava" console.log(str.replace(reg, "$2")); // "ri" console.log(str); // "javscript",原字符串保持不變,字符串永遠(yuǎn)不會(huì)變化,除非另外賦值. var str2 = str.replace(reg, (a, b, c, d, e) => { console.log(a); // "javascript" 匹配字符串 console.log(b); // "ava" $1 console.log(c); // "ri" $2 console.log(d); // 0 匹配位置 console.log(e); return 1; // 匹配結(jié)果 }); console.log(str2); // 1String.match
1.match()方法是最常用的String正則表達(dá)式方法.它的唯一參數(shù)就是一個(gè)正則表達(dá)式,返回的是一個(gè)由匹配結(jié)果組成的數(shù)組.
如果該正則表達(dá)式設(shè)置了修飾符g,則該方法返回的數(shù)組包含字符串中的所有匹配結(jié)果.
// match var str = "javascriptjava"; var reg = /java/; console.log(str.match(reg)); // ["java", 0] var text = "Visit my blog at http://www.example.com/~david"; var url = /(w+)://([w.]+)/(S*)/; var result = text.match(url); console.log(result); console.log(result.length); // 4 for (var i = 0; i < result.length; i++) { console.log(result[i]); // "http://www.example.com/~david",http,"www.example.com","~david" }String.split
split()用以將調(diào)用它的字符串拆分為一個(gè)子串組成的數(shù)組,使用的分隔符是split()參數(shù).
split()方法的參數(shù)可以是一個(gè)正則表達(dá)式,這使得split()方法異常強(qiáng)大.
// split var str = "abcde"; console.log(str.split("c")); // ["ab", "de"] // 可以指定分隔符,允許兩邊可以留有任意多的空白字符 var str = "1, 2,3, 4, 5"; console.log(str.split(/s*,s*/)); // [1, 2, 3, 4, 5]RegEXP對(duì)象
RegExp對(duì)象定義了兩個(gè)用于執(zhí)行模式匹配操作的方法.
exec()方法與match()類(lèi)似,只是RegExp方法的參數(shù)是一個(gè)字符串,而String方法的參數(shù)是一個(gè)RegExp對(duì)象.
另外一個(gè)RegExp方法是test(),它的參數(shù)是一個(gè)字符串,用test()對(duì)某個(gè)字符串進(jìn)行檢測(cè),如果包含正則表達(dá)式的一個(gè)匹配結(jié)果,則返回true.
... ?
a-zA-Z0-9 ?
0-9 ?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/84407.html
摘要:注意本文將正則與中的正則分開(kāi)討論。正則零寬斷言更多參考各種語(yǔ)言對(duì)于正則不同支持參考單行模式與多行模式通過(guò)設(shè)置正則表達(dá)式后的修飾符可開(kāi)啟對(duì)應(yīng)的匹配模式單行模式和多行模式。 最近這段時(shí)間幫同學(xué)處理一些文檔, 涉及到一些結(jié)構(gòu)化文檔的工作大部分都得使用正則表達(dá)式, 之前對(duì)于正則的認(rèn)識(shí)大多來(lái)源于語(yǔ)言書(shū)上那幾頁(yè)的介紹, 自己也沒(méi)有用過(guò)幾次。這里將我之前感到模糊的概念作個(gè)整理。因?yàn)閷?duì)JS了解多點(diǎn),所...
摘要:正則表達(dá)式一直是里比較難以掌握的點(diǎn)。在中創(chuàng)建正則的兩種方式使用字面量這就是正則表達(dá)式的字面量語(yǔ)法,表示正則表達(dá)式的模式,為正則表達(dá)式的標(biāo)志。字面量形式的正則表達(dá)式一般使用較多,也推薦大家盡可能使用這種形式,簡(jiǎn)潔易讀,符合正常的使用習(xí)慣。 正則表達(dá)式一直是js里比較難以掌握的點(diǎn)。 看不懂,學(xué)不會(huì),記不住。 每次需要用到正則的時(shí)候,都需要再去查找資料。 今天花時(shí)間把正則的知識(shí)點(diǎn)總結(jié)下,希望...
摘要:舉例一使用這個(gè)正則,打印結(jié)果為使用這個(gè)正則,打印結(jié)果為舉例二打印結(jié)果如下過(guò)濾標(biāo)簽?zāi)愫妹利惖纳虾O朕D(zhuǎn)化成你好,美麗的上海如果后面加,就會(huì)進(jìn)入非貪婪模式。如果后面不加,就會(huì)進(jìn)入貪婪模式,結(jié)果為上海。你好美麗的上海。 1.創(chuàng)建一個(gè)正則表達(dá)式 方法一:使用一個(gè)正則表達(dá)式字面量,其由包含在斜杠之間的模式組成。 var reg1 = /a/; var reg2 = /ab+c/; 方法二:調(diào)用Re...
摘要:舉例一使用這個(gè)正則,打印結(jié)果為使用這個(gè)正則,打印結(jié)果為舉例二打印結(jié)果如下過(guò)濾標(biāo)簽?zāi)愫妹利惖纳虾O朕D(zhuǎn)化成你好,美麗的上海如果后面加,就會(huì)進(jìn)入非貪婪模式。如果后面不加,就會(huì)進(jìn)入貪婪模式,結(jié)果為上海。你好美麗的上海。 1.創(chuàng)建一個(gè)正則表達(dá)式 方法一:使用一個(gè)正則表達(dá)式字面量,其由包含在斜杠之間的模式組成。 var reg1 = /a/; var reg2 = /ab+c/; 方法二:調(diào)用Re...
摘要:舉例一使用這個(gè)正則,打印結(jié)果為使用這個(gè)正則,打印結(jié)果為舉例二打印結(jié)果如下過(guò)濾標(biāo)簽?zāi)愫妹利惖纳虾O朕D(zhuǎn)化成你好,美麗的上海如果后面加,就會(huì)進(jìn)入非貪婪模式。如果后面不加,就會(huì)進(jìn)入貪婪模式,結(jié)果為上海。你好美麗的上海。 1.創(chuàng)建一個(gè)正則表達(dá)式 方法一:使用一個(gè)正則表達(dá)式字面量,其由包含在斜杠之間的模式組成。 var reg1 = /a/; var reg2 = /ab+c/; 方法二:調(diào)用Re...
摘要:控制權(quán)和傳動(dòng)這兩個(gè)詞可能在搜一些博文或者資料的時(shí)候會(huì)遇到,這里做一個(gè)解釋先控制權(quán)是指哪一個(gè)正則子表達(dá)式可能為一個(gè)普通字符元字符或元字符序列組成在匹配字符串,那么控制權(quán)就在哪。 溫馨提示:文章很長(zhǎng)很長(zhǎng),保持耐心,必要時(shí)可以跳著看,當(dāng)然用來(lái)查也是不錯(cuò)的。 正則啊,就像一座燈塔,當(dāng)你在字符串的海洋不知所措的時(shí)候,總能給你一點(diǎn)思路;正則啊,就像一臺(tái)驗(yàn)鈔機(jī),在你不知道用戶提交的鈔票真假的時(shí)候,...
閱讀 2996·2021-09-10 10:50
閱讀 3196·2019-08-30 14:19
閱讀 3525·2019-08-29 17:31
閱讀 3256·2019-08-29 16:43
閱讀 2200·2019-08-29 14:05
閱讀 2098·2019-08-29 13:17
閱讀 2054·2019-08-26 13:25
閱讀 1770·2019-08-26 12:20