亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

你不知道的 javascript正則表達(dá)式

MangoGoing / 1119人閱讀

摘要:正則表達(dá)式是用于匹配字符串中字符組合的模式。在中,正則表達(dá)式也是對(duì)象。注意如果正則表達(dá)式設(shè)置了全局匹配標(biāo)志,和的執(zhí)行會(huì)改變正則表達(dá)式屬性。顯示顯示方法執(zhí)行一個(gè)檢索,用來(lái)查看正則表達(dá)式與指定的字符串是否匹配。

正則表達(dá)式是用于匹配字符串中字符組合的模式。在 JavaScript中,正則表達(dá)式也是對(duì)象。
這些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、replace、search 和 split 方法。
正則表達(dá)式對(duì)象: 1、創(chuàng)建正則表達(dá)式的兩種形式 1.1、使用字面量來(lái)創(chuàng)建構(gòu)造函數(shù)

一個(gè)正則表達(dá)式字面量,其由包含在斜杠之間的模式組成/pattern/flags
pattern: 正則表達(dá)式的文本。
flags: 正則表達(dá)式的標(biāo)志
例如:全局查找含有hello字符的字符串,忽略字符的大小寫(xiě)

var regexp = /hello/gi
regexp.test(" Hello world")        //true
regexp.test("Say hEllo")    //true
1.2、使用構(gòu)造函數(shù)來(lái)創(chuàng)建正則表達(dá)式

使用構(gòu)造函數(shù)提供正則表達(dá)式的運(yùn)行時(shí)編譯,如果你要?jiǎng)討B(tài)生成一個(gè)正則表達(dá)式應(yīng)該選用這種方式
new RegExp(pattern [, flags])
例如:

let regex = new RegExp("ab+c", "img");

構(gòu)造函數(shù)可以接受正則表達(dá)式文本和字符串,作為第一個(gè)參數(shù), 正則表達(dá)式標(biāo)志作為第二個(gè)參數(shù)

let regex = new RegExp(/^[a-zA-Z]+[0-9]*W?_$/, "gi");

注意如果構(gòu)造函數(shù)的第一個(gè)參數(shù)傳入的是字符串,它須要經(jīng)過(guò)以下幾個(gè)步驟的處理:
1.去掉正則表達(dá)式文本兩頭的 /
2.正則表達(dá)式文本里面的所有 都要進(jìn)行轉(zhuǎn)義寫(xiě)成

let regex = new RegExp("^[a-zA-Z]+[0-9]*W?_$", "gi");

當(dāng)我們要做一個(gè)很復(fù)雜的查找時(shí),可以像下面這樣分解步驟

let str = "^&*()_ 
sdf7$df NN
2、正則表達(dá)式對(duì)象的lastIndex屬性

lastIndex是正則表達(dá)式實(shí)例的一個(gè)讀/寫(xiě)整數(shù)屬性,它指定從哪個(gè)索引開(kāi)始下一個(gè)匹配。
The lastIndex is a read/write integer property of regular expression instances that specifies the index at which to start the next match.

var regex1 = new RegExp( "ble", "g" );
var str1 = "table football, foosball";

var judage1 = regex1.test(str1);    
console.log(judage1);                //true
console.log(regex1.lastIndex);       //5 

var judage2 = regex1.test(str1);   
console.log(judage2);                //false
console.log(regex1.lastIndex);       //0 

這里我們可以看到同一個(gè)全局檢索的正則表達(dá)式(含有g(shù)),執(zhí)行多次后,檢索的內(nèi)容竟然是不同的。judage1 為 true,judage2 為false。因?yàn)榈谝淮螜z索后lastIndex會(huì)被改變,指向它匹配字符所在處的最后一個(gè)索引+1。而之后再次調(diào)用正則檢索,正則會(huì)從上一次lastIndex停止的地方開(kāi)始檢索。所以第一次匹配能夠匹配到“ble”,而第二次從上一次“ble”停下的地方開(kāi)始檢索,后面沒(méi)有“ble”字符,所以judage2 = false。
?注意:
如果正則表達(dá)式設(shè)置了全局匹配標(biāo)志g,test() 和 exec()的執(zhí)行會(huì)改變正則表達(dá)式 lastIndex屬性。連續(xù)的執(zhí)行test()方法,后續(xù)的執(zhí)行將會(huì)從 lastIndex 處開(kāi)始匹配字符串

var regex1 = new RegExp( "ble", "g" );
var str1 = "table football, foosball";
console.log(regex1.test(str1))        //true
console.log(regex1.test(str1))        //false

因?yàn)槎啻握{(diào)用設(shè)置了全局匹配標(biāo)志g的test(), 會(huì)導(dǎo)致 regex1的lastIndex 屬性改變。所以千萬(wàn)不要在for 循環(huán)里面調(diào)用含有全局匹配標(biāo)志g的正則函數(shù),那樣匹配驗(yàn)證會(huì)出問(wèn)題。

3、編寫(xiě)一個(gè)正則表達(dá)式的模式 3.1、使用簡(jiǎn)單的模式
let regexp = /abc/;        //直接匹配在一個(gè)字符串中,是否含有字符"abc"
regexp.test("123abc @#$hh")        //true
3.2、使用特殊字符
let regexp = /ab*c/                //* 是特殊字符,意思是前面一項(xiàng)出現(xiàn)了零個(gè)或者多個(gè)
regexp.test("123ac @#$hh")                //true
regexp.test("123abbbbbbbbbbc @#$hh")      //true  
regexp.test("123abdc @#$hh")              //false  
4、正則表達(dá)式有哪些特殊字符 4.1、簡(jiǎn)單的特殊字符
字符 含義
是一個(gè)轉(zhuǎn)義字符
1.放在普通字符前面將后面的普通字符轉(zhuǎn)義成特殊字符
/d/是匹配一個(gè)字符d,而/d/ 就是匹配一個(gè)數(shù)字
2.放在特殊字符前面,將后面特殊字符轉(zhuǎn)化成普通字符
/A*/是匹配0個(gè)至多個(gè)A,/A*/就真的是匹配 "A*" 字符
3. 使用 new RegExp("pattern") 的時(shí)候不要忘記將 進(jìn)行轉(zhuǎn)義,因?yàn)? 在字符串里面也是一個(gè)轉(zhuǎn)義字符。
new RegExp("d")只匹配d字符,? ?new? RegExp("d")? 才會(huì)匹配數(shù)字
^ 匹配輸入的開(kāi)始。如果設(shè)置了多行標(biāo)志m,那么也匹配換行符后緊跟的位置。
例如,/^A/ 并不會(huì)匹配 "an A" 中的 "A",但是會(huì)匹配 "An E" 中的 "A"。
/^w/m 并不會(huì)匹配 "Hello world"中的 "w", 也不會(huì)匹配 "Hellon world"(w前面有空格),但是會(huì)匹配 "Hello world"
$ 匹配輸入的結(jié)束。如果設(shè)置了多行標(biāo)志m,那么也匹配換行符前的位置。
例如,/t$/ 并不會(huì)匹配 "eater" 中的 "t",但是會(huì)匹配 "eat" 中的 "t"。
* 匹配前一個(gè)字符0次或多次。等價(jià)于 {0,}。
例如,/bo*/會(huì)匹配 "A ghost boooooed" 中的 "booooo" 和 "A bird warbled" 中的 "b",但是在 "A goat grunted" 中將不會(huì)匹配任何東西。
注意/bo*/ 意思是以b字母開(kāi)頭,后面有0個(gè)或多個(gè)o,而不是有0個(gè)或多個(gè)bo
*只針對(duì)離它最近的字符
/(bo)*/ 意思才是匹配0個(gè)或多個(gè)"bo"
. (小數(shù)點(diǎn))匹配除換行符之外的任何單個(gè)字符。
例如,/.n/將會(huì)匹配 "nay, an apple is on the tree" 中的 "an" 和 "on",但是不會(huì)匹配 "nay",因?yàn)?"." 會(huì)將每條字符串的首部視作有一個(gè)換行符
x|y 匹配‘x’或者‘y’。
例如,/green|red/匹配“green apple”中的‘green’和“red apple”中的‘red’
{n} n是一個(gè)正整數(shù),匹配了前面一個(gè)字符剛好發(fā)生了n次。
比如,/a{2}/不會(huì)匹配“candy”中的"a",但是會(huì)匹配“caandy”中所有的a,以及“caaandy”中的前兩個(gè)"a"。
{n,m} n 和 m 都是整數(shù)。匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 這個(gè)值被忽略。
例如,/a{1, 3}/ 并不匹配“cndy”中的任意字符,匹配“candy”中的a,匹配“caandy”中的前兩個(gè)a,也匹配“caaaaaaandy”中的前三個(gè)a。注意,當(dāng)匹配”caaaaaaandy“時(shí),匹配的值是“aaa”,即使原始的字符串中有更多的a。
注意:{n,m}之間沒(méi)有空格
[xyz] 一個(gè)字符集合。匹配方括號(hào)中的任意字符,包括轉(zhuǎn)義序列。你可以使用破折號(hào)(-)來(lái)指定一個(gè)字符范圍。
對(duì)于點(diǎn)(.)和星號(hào)(*)這樣的特殊符號(hào),如果不進(jìn)行轉(zhuǎn)義,在一個(gè)字符集中沒(méi)有特殊的意義。
/[ad]/g 只會(huì)匹配“add 20190726”中的 ‘a(chǎn)’和‘d’,并不會(huì)匹配數(shù)字
如果進(jìn)行了轉(zhuǎn)義
/[ad]/g 就會(huì)匹配“add 20190726”中的‘a(chǎn)’和所有數(shù)字
[^xyz] 一個(gè)反向字符集。也就是說(shuō), 它匹配任何沒(méi)有包含在方括號(hào)中的字符。你可以使用破折號(hào)(-)來(lái)指定一個(gè)字符范圍。
使用方法同[xyz], 只是 [^xyz]是不包含
例如,[^abc] 和 [^a-c] 是一樣的。他們匹配"brisket"中的‘r’,也匹配“chop”中的‘h’。
d 匹配一個(gè)數(shù)字。
等價(jià)于[0-9]。
例如, /d/ 或者 /[0-9]/ 匹配"B2 is the suite number."中的"2"。
D 匹配一個(gè)非數(shù)字字符。
等價(jià)于[^0-9]。
例如, /D/ 或者 /[^0-9]/ 匹配"B2 is the suite number."中的"B"。
w 匹配一個(gè)單字字符(字母、數(shù)字或者下劃線)。
等價(jià)于[A-Za-z0-9_]。
例如, /w/ 匹配 "apple," 中的 "a","$5.28,"中的 "5" 和 "3D." 中的 "3"。
W 匹配一個(gè)非單字字符。
等價(jià)于[^A-Za-z0-9_]。
例如, /W/ 或者 /[^A-Za-z0-9_]/ 匹配 "50%." 中的 "%"
4.2、高級(jí)的特殊字符

更新中

正則表達(dá)式對(duì)象常用的3種方法: 1、RegExp.prototype.toString()

RegExp 對(duì)象并沒(méi)有繼承 Object.prototype.toString(),而是覆蓋了 Object 對(duì)象的 toString() 方法,對(duì)于 RegExp 對(duì)象,toString 方法返回一個(gè)該正則表達(dá)式的字符串形式。

myExp = new RegExp("a+b+c");
console.log(myExp.toString());       // 顯示 "/a+b+c/"

foo = new RegExp("bar", "g");
console.log(foo.toString());         // 顯示 "/bar/g"
2、RegExp.prototype.test()

test() 方法執(zhí)行一個(gè)檢索,用來(lái)查看正則表達(dá)式與指定的字符串是否匹配。返回 true 或 false。
即一個(gè)字符串是否包含滿足這個(gè)正則表達(dá)式的子字符串

let _regexp = new RegExp("Wo" , "i");
let str = "hello world!";
let result = _regexp.test(str);
console.log(result);    //true
3、RegExp.prototype.exec()

exec() 方法在一個(gè)指定字符串中執(zhí)行一個(gè)搜索匹配。返回一個(gè)結(jié)果數(shù)組或 null。
如果匹配成功,exec() 方法返回一個(gè)數(shù)組,并更新正則表達(dá)式對(duì)象的屬性。返回的數(shù)組將完全匹配成功的文本作為第一項(xiàng),將正則括號(hào)里匹配成功的作為數(shù)組填充到后面。

var params = "user"
var regexp = new RegExp("[?#&]" + params + "=([^&#]*)", "i")
var str = "www.qq.com?user=Tom&psw=123456";
var res = regexp.exec(str);
console.log(res)    // ["?user=Tom", "Tom"]

可以看到返回?cái)?shù)組的第一個(gè)元素就是整個(gè)的匹配模式所匹配到的字符串,而第二個(gè)匹配到的字符恰好是參數(shù)值。這是exec匹配返回的規(guī)則:第一個(gè)元素為整個(gè)的匹配字符串,從第二個(gè)參數(shù)開(kāi)始返回模式中每一個(gè)()自身正則所匹配的字符串。這里面([^]*)返回的就是不以&或#開(kāi)頭的字符串,即等號(hào)后面對(duì)應(yīng)的參數(shù)Tom。

然后我們給params 再加一個(gè)括號(hào), 便把params(匹配到的)也輸出來(lái)了。

var params = "user"
var regexp = new RegExp("[?#&]" + "(" +params+ ")" + "=([^&#]*)", "i")
var str = "www.qq.com?user=Tom&psw=123456";
var res = regexp.exec(str);
console.log(res)    // ["?user=Tom", "user", "Tom"]
String 對(duì)象使用正則的幾種方法 1、match方法

match 方法檢索返回一個(gè)字符串匹配正則表達(dá)式的的結(jié)果。
當(dāng)你不使用g標(biāo)志,即不進(jìn)行全局檢索時(shí), 僅返回第一個(gè)完整匹配及其相關(guān)的捕獲組(Array)。

let str = "……ssdf #$%^& ab Abbbbb ABC153**";
let regexp = new RegExp("ab", "i");
let result = str.match(regexp)
console.log(result)

輸出:
[
  "ab",         //第一個(gè)完整的匹配項(xiàng)       
  index: 13,    //匹配結(jié)果的開(kāi)始位置
  input: "……ssdf #$%^& ab Abbbbb ABC153**",        //搜索的字符串
  groups: undefined        //一個(gè)捕獲組數(shù)組 或 undefined(如果沒(méi)有定義命名捕獲組)
]

如果match沒(méi)有匹配到任何項(xiàng),則會(huì)直接返回null

let regexp2 = new RegExp("xxx", "i");
let result2 = str.match(regexp2)
//null

?注意match還有兩種特殊的使用情況:
1、match 如果傳入一個(gè)非正則表達(dá)式對(duì)象,則會(huì)隱式地使用 new RegExp(obj) 將其轉(zhuǎn)換為一個(gè) RegExp

let result3 = str.match("ab")    //str.match("ab") = str.match(new RegExp("ab"));

輸出還是和之前一樣:
[
  "ab",
  index: 13,
  input: "……ssdf #$%^& ab Abbbbb ABC153**",
  groups: undefined
]

2、如果你沒(méi)有給出任何參數(shù)并直接使用match() 方法 ,你將會(huì)得到一 個(gè)包含空字符串的 Array :[""] ,而不是null。

let result 4 = str.match()

輸出:
[
  "",
  index: 0,
  input: "……ssdf #$%^& ab Abbbbb ABC153**",
  groups: undefined
]
2、replace方法

通過(guò)正則查找到匹配項(xiàng),然后替換這些字符,注意replace方法只會(huì)返回替換后的結(jié)果,不會(huì)改變?cè)址?br>使用示例:
1、直接替換字符串默認(rèn)只會(huì)替換第一次匹配的項(xiàng)。

let str = "……ssdf #$%^& ab Abbbbb ABC153**";
let result = str.replace("s", 77)
console.log(result)        //……77sdf #$%^& ab Abbbbb ABC153**
默認(rèn)只會(huì)替換第一個(gè)s

2、正則加g標(biāo)志,全局替換所有匹配的字符

let str = "……ssdf #$%^& ab Abbbbb ABC153**";
let reg = /ab/gi
let result = str.replace(reg, "T")
console.log(result)        //……ssdf #$%^& T Tbbbb TC153**
所有的ab都替換成了 T
3、替換字符串支持插入下面的特殊變量名

① $& 插入匹配的子串

let str = "劉一、陳二、張三、李四、王五、趙六、孫七、周八、吳九、鄭十"
let reg = new RegExp("[張趙孫][三七八]", "gi")
let result = str.replace(reg, "新名字")
console.log(result)
//劉一、陳二、新名字、李四、王五、趙六、新名字、周八、吳九、鄭十

let result2 = str.replace(reg, "新名字$&");
console.log(result2)
//劉一、陳二、新名字張三、李四、王五、趙六、新名字孫七、周八、吳九、鄭十

② $` 插入當(dāng)前匹配的子串左邊的內(nèi)容。

let result3 = str.replace(reg, "新名字$`");
console.log(result3)
//劉一、陳二、新名字劉一、陳二、、李四、王五、趙六、新名字劉一、陳二、張三、李四、王五、趙六、、周八、吳九、鄭十

③ $" 插入當(dāng)前匹配子串右邊的內(nèi)容

④ $n 插入第n個(gè)括號(hào)匹配的字符串
?注意:
new RexExp()第一個(gè)參數(shù)需要是一個(gè)含有正則的文本
n 是個(gè)小于100的非負(fù)整數(shù)
索引是從1開(kāi)始(即插入第一個(gè)括號(hào)里面匹配的內(nèi)容為 $1)
例子:

var re = /(w+)s(w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
console.log(newstr);    // Smith, John
//分析第一個(gè)括號(hào)里面匹配到了John 即 $1是John,第二個(gè)括號(hào)里面匹配到了 Smith, 即$2 為Smith
3、search方法

如果匹配成功,則 search() 返回正則表達(dá)式在字符串中首次匹配項(xiàng)的索引;否則,返回 -1。

let str = "Hello AbC aBC ABC abc"
let result = str.search(/abc/gi);
console.log(result)    //6
//注意即使你用了全局查找標(biāo)志g,search也只會(huì)返回首次匹配的索引,索引走0開(kāi)始
4、Split 方法
// split 方法默認(rèn)搜素全局,所以不管你的正則是否使用了g標(biāo)志,結(jié)果都一樣
let str = "Hello AbC aBC ABC abc"
let result = str.split(/[a]/);
let result2 = str.split(/[a]/g);
console.log(result)        //[ "Hello AbC ", "BC ABC ", "bc" ]
console.log(result2)       //[ "Hello AbC ", "BC ABC ", "bc" ]

//split 可以限制分割幾塊字符串,當(dāng)返回的分割字塊到達(dá)限制大小時(shí)分割停止
let result3 = str.split(/[a]/g, 2);
console.log(result3)        //[ "Hello AbC ", "BC ABC " ]

//當(dāng)分割的限制大于返回?cái)?shù)組的長(zhǎng)度時(shí)
let result3 = str.split(/[a]/g, 3000);
console.log(result3)        //[ "Hello AbC ", "BC ABC ", "bc" ]
參考資料
MDN web docs 正則表達(dá)式

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/106146.html

相關(guān)文章

  • 前端文檔收集

    摘要:系列種優(yōu)化頁(yè)面加載速度的方法隨筆分類中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁(yè)性能管理詳解離線緩存簡(jiǎn)介系列編寫(xiě)高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問(wèn)性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁(yè)面加載速度的方法 隨筆分類 - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁(yè)性能管理詳解 HTML5 ...

    jsbintask 評(píng)論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁(yè)面加載速度的方法隨筆分類中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁(yè)性能管理詳解離線緩存簡(jiǎn)介系列編寫(xiě)高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問(wèn)性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁(yè)面加載速度的方法 隨筆分類 - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁(yè)性能管理詳解 HTML5 ...

    muddyway 評(píng)論0 收藏0
  • Node.js 指南(不要阻塞事件循環(huán)或工作池)

    摘要:為什么要避免阻塞事件循環(huán)和工作池使用少量線程來(lái)處理許多客戶端,在中有兩種類型的線程一個(gè)事件循環(huán)又稱主循環(huán)主線程事件線程等,以及一個(gè)工作池也稱為線程池中的個(gè)的池。 不要阻塞事件循環(huán)(或工作池) 你應(yīng)該閱讀這本指南嗎? 如果你編寫(xiě)的內(nèi)容比簡(jiǎn)短的命令行腳本更復(fù)雜,那么閱讀本文應(yīng)該可以幫助你編寫(xiě)性能更高、更安全的應(yīng)用程序。 本文檔是在考慮Node服務(wù)器的情況下編寫(xiě)的,但這些概念也適用于復(fù)雜的N...

    hatlonely 評(píng)論0 收藏0
  • 翻譯連載 | 第 9 章:遞歸(上)-《JavaScript輕量級(jí)函數(shù)式編程》 |《你不知道JS》

    摘要:一旦我們滿足了基本條件值為,我們將不再調(diào)用遞歸函數(shù),只是有效地執(zhí)行了。遞歸深諳函數(shù)式編程之精髓,最被廣泛引證的原因是,在調(diào)用棧中,遞歸把大部分顯式狀態(tài)跟蹤換為了隱式狀態(tài)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;...

    MasonEast 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<