摘要:用法介紹注為的實(shí)例為的實(shí)例用法說明返回值判斷是否包含匹配結(jié)果包含返回,不包含返回。當(dāng)為全局的對象的時(shí)候,替換每一項(xiàng)匹配項(xiàng)。如下表所示,它說明從模式匹配得到的字符串將用于替換。字符替換文本與中的第到第個(gè)子表達(dá)式相匹配的文本。
上面這四個(gè)方法在js中用的很多,但有時(shí)對它們又不清晰,所以有必要來總結(jié)一下。
對了,這篇文章可能會(huì)涉及到正則表達(dá)式相關(guān)知識(shí),所以推薦沒有正則基礎(chǔ)的去看看這篇入門文章:正則表達(dá)式30分鐘入門教程,很經(jīng)典的文章,反正我的正則就是從這里學(xué)的,^▽^ 。
用法介紹注:pattern 為RegExp的實(shí)例, str 為String的實(shí)例
用法 | 說明 | 返回值 |
---|---|---|
pattern.test(str) | 判斷str是否包含匹配結(jié)果 | 包含返回true,不包含返回false。 |
pattern.exec(str) | 根據(jù)pattern對str進(jìn)行正則匹配 | 返回匹配結(jié)果數(shù)組,如匹配不到返回null |
str.match(pattern) | 根據(jù)pattern對str進(jìn)行正則匹配 | 返回匹配結(jié)果數(shù)組,如匹配不到返回null |
str.replace(pattern, replacement) | 根據(jù)pattern進(jìn)行正則匹配,把匹配結(jié)果替換為replacement | 一個(gè)新的字符串 |
字符串的test方法,比較常用在判斷語句中,最簡單的RegExp方法了,用于檢測一個(gè)字符串是否匹配某個(gè)模式:
RegExpObject.test(string)
如果字符串 string 中含有與 RegExpObject 匹配的文本,則返回 true,否則返回 false:
/d/.test("asdf2") // --true 檢測字符串`"asdf2"`中是否函數(shù)數(shù)字exec()
exec()方法功能非常強(qiáng)大,它是一個(gè)通用的方法方法,用于比較復(fù)雜的模式匹配或者是說你為你提供更多的信息:
RegExpObject.exec(string)
如果在string中找到了匹配的文本,則返回一個(gè)包含這些文本的數(shù)組,否側(cè)返回null。這里有幾個(gè)注意的地方:
返回的數(shù)組的第一個(gè)元素是與整個(gè)正則匹配的文本
然后數(shù)組的第二個(gè)元素是與整個(gè)正則的第一個(gè)子表達(dá)式(分組)相匹配的文本
數(shù)組的第三個(gè)元素整個(gè)正則的第二個(gè)子表達(dá)式(分組)相匹配的文本,以此類推。
``` var result = /(d+)-(w+)/.exec("12-ab"); console.log(result) // --> ["12-ab", "12", "ab", index: 0, input: "12-ab"] //為什么上面返回的“數(shù)組”是那么奇怪,按照[w3school][2]的說法就是:exec() 都會(huì)把完整的細(xì)節(jié)添加到它返回的數(shù)組中,這里的細(xì)節(jié)指的就是index和input ``` 整個(gè)正則表達(dá)式匹配的文本:`"12-ab"` 第一個(gè)子表達(dá)式匹配的文本:`"12"` 第二個(gè)子表達(dá)式匹配的文本:`"ab"`
從上面返回的數(shù)組結(jié)果可知,數(shù)組添加了兩個(gè)額外的屬性,分別是:index, input
index: 匹配文本的第一個(gè)字符的位置.
input: 顧名思義,就是指輸入的整體的文本了.
``` console.log(result.index) // --> 0 console.log(result.input) // --> "12-ab" ```
執(zhí)行exec函數(shù)時(shí),盡管是全局匹配的正則表達(dá)式,但是exec方法只對指定的字符串進(jìn)行一次匹配,
獲取字符串中第一個(gè)與正則表達(dá)式想匹配的內(nèi)容,并且將匹配內(nèi)容和子匹配的結(jié)果存儲(chǔ)到返回的數(shù)組中,
例如:/d/g.exec("a22") ,返回的結(jié)果和上面的結(jié)果一樣: ["2"]
/d/g.exec("a22") // -->["2"]深入了解 exec()
深入前看看RegExp的實(shí)例有哪些屬性:
global: 布爾值,表示是否設(shè)置了 g 標(biāo)志
ignoreCase: 布爾值,表示是否設(shè)置了 i 標(biāo)志
lastIndex: 搜索下一個(gè)匹配項(xiàng)時(shí)開始的位置,從0開始
multiline: 布爾值,表示是否設(shè)置了 m 標(biāo)志
source: 正則表達(dá)式的字符串表示
這里稍微陌生一點(diǎn)的就是lastIndex屬性了,因?yàn)槲覀儾粫?huì)顯示的需要用到它。但它還是挺重要的:
例1:非全局匹配
var reg = /d/; //第一次匹配 console.log(reg.exec("a123")); console.log(reg.lastIndex); //輸出 ["1"] 0 第二次匹配 console.log(reg.exec("a123")); console.log(reg.lastIndex); //輸出 ["1"] 0
結(jié)論:
同一正則表達(dá)式,在非全局匹配模式下,每次實(shí)例的lastIndex屬性的值總是不變的(為第一次找到匹配文本所在的位置,上面為0 );
每次的匹配查找都是將lastIndex作為起始位置的
例2:全局匹配
var reg = /d/g; //第一次匹配 console.log(reg.exec("a123")); console.log(reg.lastIndex); //輸出 ["1"] 2 第二次匹配 console.log(reg.exec("a123")); console.log(reg.lastIndex); //輸出 ["2"] 3 第三次匹配 console.log(reg.exec("a123")); console.log(reg.lastIndex); //輸出 ["3"] 4 第四匹配 console.log(reg.exec("a123")); console.log(reg.lastIndex); //輸出 null 0
結(jié)論:
同一正則表達(dá)式,在全局匹配模式下,每次實(shí)例的lastIndex屬性的值為匹配文本最后一個(gè)字符的下一個(gè)位置,上面例子中第一次匹配的時(shí)候最后一個(gè)字符位置為1,則下一個(gè)位置為:2
當(dāng) exec() 再也找不到匹配的文本時(shí),它將返回 null,并把 lastIndex 屬性重置為 0。
那當(dāng)要獲取全局匹配的全部匹配項(xiàng)時(shí),可以通過循環(huán)來獲取:
var reg = /d/g, result = [], crt; while((crt = reg.exec("a123")) !== null){ result = result.concat(crt) }; result; //["1", "2", "3"]String對象方法 1. match()
match() 方法可在字符串內(nèi)檢索指定的值,或找到一個(gè)或多個(gè)正則表達(dá)式的匹配。在一定程度上它與上面的exec()有些相似,看一下吧:
例1:非全局匹配
var a = "aaaa".match(/w/); console.log(a); // ["a", index: 0, input: "aaaa"]
可以看到,和exec()一樣,在數(shù)組中返回了index 和 input屬性。
例2:全局匹配
var a = "aaaa".match(/w/g); console.log(a); // ["a", "a", "a", "a"]
全局匹配就和exec方法有很大的不同了,他直接返回了所有符合匹配的子字符串的數(shù)組,另外,index和input屬性也不在其中了,所以這個(gè)方法效率可能會(huì)高一些,但是如果你需要更多的信息,則用exec()吧
2. replace()這也是一個(gè)比較靈活常用的方法,它用于在字符串中用一些字符替換另一些字符,或替換一個(gè)與正則表達(dá)式匹配的子串。
這個(gè)方法接收兩個(gè)必須的參數(shù):
pattern: 這個(gè)參數(shù)可以是字符串或是RegExp對象
replacement: 替換匹配項(xiàng)的字符串或處理函數(shù)的返回值
返回結(jié)果:
當(dāng)未找到匹配項(xiàng)的時(shí)候,返回原始字符串。
"aaaa".replace("bbb", "b") //"aaaa"
當(dāng)pattern為字符串或者為非全局的RegExp對象的時(shí)候,只替換找到的第一項(xiàng)匹配項(xiàng)。
"aaaa".replace("a", "b") //"baaa" "aaaa".replace(/w/, "b") //"baaa"
當(dāng)pattern為全局的RegExp對象的時(shí)候,替換每一項(xiàng)匹配項(xiàng)。
"aaaa".replace(/w/g, "b") //"bbbb"
replacement:為函數(shù)時(shí):
"aaaa".replace(/w/g, function() { return "b"; }); // "bbbb" "aaaa".replace(/w/g, function(value) { return value.toUpperCase(); }); // "AAAA"
結(jié)論:
函數(shù)的返回值將作為替換字符串
函數(shù)的第一個(gè)參數(shù)的值是每一個(gè)匹配項(xiàng),當(dāng)然還有第二個(gè)參數(shù),它的值是每個(gè)匹配項(xiàng)在原始字符串的中位置,從0開始
特殊的 $:
replacement 中的 $ 字符具有特定的含義。如下表所示,它說明從模式匹配得到的字符串將用于替換。
字符 | 替換文本 |
---|---|
$1、$2、...、$99 | 與 regexp 中的第 1 到第 99 個(gè)子表達(dá)式相匹配的文本。 |
$& | 與 regexp 相匹配的子串 |
$` | 位于匹配子串左側(cè)的文本 |
$" | 位于匹配子串右側(cè)的文本 |
$$ | 直接量符號 |
來一發(fā):
//第一種情況: "aa11AA".replace(/([a-z]+)(d+)([A-Z]+)/g, "$1"); // "aa" "aa11AA".replace(/([a-z]+)(d+)([A-Z]+)/g, "$2"); // "11" "aa11AA".replace(/([a-z]+)(d+)([A-Z]+)/g, "$3"); // "AA" //猜想 如果是 $4 回事什么呢? undefined ? "aa11AA".replace(/([a-z]+)(d+)([A-Z]+)/g, "$4"); // "$4" //所以,要是沒有該子項(xiàng),則當(dāng)成普通字符串處理了 //第二種情況: "aa11AA".replace(/([a-z]+)(d+)([A-Z]+)/g, "$&"); //"aa11AA" //第三種情況: "aa11AA".replace(/(d+)/g, "$`"); //"aaaaAA" //第四種情況: "aa11AA".replace(/(d+)/g, "$""); //"aaAAAA" //第五種情況: "aa11AA".replace(/(d+)/g, "$$"); //"aa$AA"
先這樣吧,有問題再補(bǔ)充了,( ╯□╰ )
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85916.html
摘要:寫在前面的一些廢話沒有看過上一篇文章的盆友有福了今天沒錯(cuò)就是現(xiàn)在我將免費(fèi)免費(fèi)將上篇文章的鏈接發(fā)出來這里是上篇上回說了怎么寫出正則,這次展示下在中使用正則的場景正則對象屬性的正則對象有以下幾個(gè)屬性,其中前面三個(gè)也叫修飾符也就是表達(dá)式兩條杠后面 寫在前面的一些廢話 沒有看過上一篇文章的盆友有福了! 今天!沒錯(cuò)!就是現(xiàn)在!我將免費(fèi)!all f*cking FREE! 免費(fèi)將上篇文章的鏈接發(fā)出...
摘要:基本語法構(gòu)造函數(shù)可創(chuàng)建一個(gè)正則表達(dá)式對象,用特定的模式匹配文本。要表示字符串,字面量形式不使用引號,而傳遞給構(gòu)造函數(shù)的參數(shù)使用引號。當(dāng)使用構(gòu)造函數(shù)創(chuàng)造正則對象時(shí),需要常規(guī)的字符轉(zhuǎn)義規(guī)則在前面加反斜杠。結(jié)果替換與正則表達(dá)式匹配的子串。 文章來源:小青年原創(chuàng)發(fā)布時(shí)間:2016-06-26關(guān)鍵詞:JavaScript,正則表達(dá)式,js模板引擎轉(zhuǎn)載需標(biāo)注本文原始地址: http://zhaom...
摘要:正則大法好,正則大法好,正則大法好,重要的事情說三遍。第二部分,這個(gè)部分是整個(gè)表達(dá)式的關(guān)鍵部分。學(xué)習(xí)正則如果還沒有系統(tǒng)學(xué)習(xí)正則表達(dá)式,這里提供一些網(wǎng)上經(jīng)典的教程供大家學(xué)習(xí)。正則表達(dá)式使用單個(gè)字符串來描述匹配一系列匹配某個(gè)句法規(guī)則的字符串。 原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動(dòng)態(tài),大家一起多交流學(xué)習(xí),共同...
摘要:正則大法好,正則大法好,正則大法好,重要的事情說三遍。第二部分,這個(gè)部分是整個(gè)表達(dá)式的關(guān)鍵部分。學(xué)習(xí)正則如果還沒有系統(tǒng)學(xué)習(xí)正則表達(dá)式,這里提供一些網(wǎng)上經(jīng)典的教程供大家學(xué)習(xí)。正則表達(dá)式使用單個(gè)字符串來描述匹配一系列匹配某個(gè)句法規(guī)則的字符串。 原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動(dòng)態(tài),大家一起多交流學(xué)習(xí),共同...
閱讀 2787·2021-11-19 11:30
閱讀 3069·2021-11-15 11:39
閱讀 1793·2021-08-03 14:03
閱讀 1999·2019-08-30 14:18
閱讀 2055·2019-08-30 11:16
閱讀 2169·2019-08-29 17:23
閱讀 2611·2019-08-28 18:06
閱讀 2545·2019-08-26 12:22