摘要:等價于實例屬性正則對象的實例屬性分成兩類。返回一個布爾值,表示是否設置了修飾符。字符串對象的方法,返回第一個滿足條件的匹配結(jié)果在整個字符串中的位置。字符串對象的方法按照正則規(guī)則分割字符串,返回一個由分割后的各個部分組成的數(shù)組。
概述
實例屬性
實例方法
RegExp.prototype.test()g
RegExp.prototype.exec()g括號indexx input屬性
字符串的實例方法
String.prototype.match()像exec返回字符串數(shù)組 區(qū)別g一次返回全部 lastibdex無效
String.prototype.search()
String.prototype.replace()加g一次換全部
String.prototype.split()
匹配規(guī)則
字面量字符和元字符
轉(zhuǎn)義符
特殊字符
字符類
預定義模式
重復類
量詞符
貪婪模式
修飾符
組匹配
1.概述
正則表達式(regular expression)是一種表達文本模式(即字符串結(jié)構(gòu))的方法
1.1新建正則表達式有兩種方法。一種是使用字面量,以斜杠表示開始和結(jié)束。
var regex = /xyz/;
另一種是使用RegExp構(gòu)造函數(shù)。
var regex = new RegExp("xyz");
主要區(qū)別是,第一種方法在引擎編譯代碼時,就會新建正則表達式,第二種方法在運行時新建正則表達式,所以前者的效率較高
RegExp構(gòu)造函數(shù)還可以接受第二個參數(shù),表示修飾符(詳細解釋見下文)。
var regex = new RegExp("xyz", "i");
// 等價于
var regex = /xyz/i;
2.實例屬性
正則對象的實例屬性分成兩類。
一類是修飾符相關,用于了解設置了什么修飾符。
RegExp.prototype.ignoreCase:返回一個布爾值,表示是否設置了i修飾符。
RegExp.prototype.global:返回一個布爾值,表示是否設置了g修飾符。
RegExp.prototype.multiline:返回一個布爾值,表示是否設置了m修飾符。
RegExp.prototype.flags:返回一個字符串,包含了已經(jīng)設置的所有修飾符,按字母排序。
上面四個屬性都是只讀的。
var r = /abc/igm;
r.ignoreCase // true
r.global // true
r.multiline // true
r.flags // "gim"
另一類是與修飾符無關的屬性,主要是下面兩個。
RegExp.prototype.lastIndex:返回一個整數(shù),表示下一次開始搜索的位置。該屬性可讀寫,但是只在進行連續(xù)搜索時有意義,詳細介紹請看后文。
RegExp.prototype.source:返回正則表達式的字符串形式(不包括反斜杠),該屬性只讀。
var r = /abc/igm;
r.lastIndex // 0
r.source // "abc"
3.實例方法
3.1RegExp.prototype.test()
返回布爾值,看是否匹配
3.1.1帶g
(1)則每一次test方法都從上一次結(jié)束的位置開始向后匹配。 回記住lastindex
var r = /x/g;
var s = "_x_x";
r.lastIndex // 0
r.test(s) // true
r.lastIndex // 2
r.test(s) // true
r.lastIndex // 4
r.test(s) // false
(2)可以指定lastIndex屬性指定開始搜索的位置,
var r = /x/g;
var s = "_x_x";
r.lastIndex = 4;
r.test(s) // false
r.lastIndex // 0
r.test(s)
(3)注意,帶有g修飾符時,正則表達式內(nèi)部會記住上一次的lastIndex屬性,這時不應該更換所要匹配的字符串,否則會有一些難以察覺的錯誤。
var r = /bb/g;
r.test("bb") // true
r.test("-bb-") // false
(4)lastIndex屬性只對同一個正則表達式有效,所以下面這樣寫是錯誤的。
var count = 0;
while (/a/g.test("babaa")) count++;
上面代碼會導致無限循環(huán),因為while循環(huán)的每次匹配條件都是一個新的正則表達式,導致lastIndex屬性總是等于0。每次新建一個regexp對象
3.1.3如果正則模式是一個空字符串,則匹配所有字符串。
new RegExp("").test("abc")
// true
3.1.2RegExp.prototype.exec()
匹配到的返回字符串數(shù)組,只有一個元素的數(shù)組。否則返回null
(1)有括號(組匹配) 返回多個成員
第一個成員是整個匹配成功的結(jié)果,后面的成員就是圓括號對應的匹配成功的組。也就是說,第二個成員對應第一個括號,第三個成員對應第二個括號,以此類推。整個數(shù)組的length屬性等于組匹配的數(shù)量再加1。
var s = "_x_x";
var r = /_(x)/;
r.exec(s) // ["_x", "x"]
上面代碼的exec方法,返回一個數(shù)組。第一個成員是整個匹配的結(jié)果,第二個成員是圓括號匹配的結(jié)果。
(2)exec方法的返回數(shù)組還包含以下兩個屬性:
input:整個原字符串。
index:整個模式匹配成功的開始位置(從0開始計數(shù))。
var r = /a(b+)a/;
var arr = r.exec("_abbba_aba_");
arr // ["abbba", "bbb"]
arr.index // 1
arr.input // "_abbba_aba_"
上面代碼中的index屬性等于1,是因為從原字符串的第二個位置開始匹配成功。
(3)正則表達式加上g修飾符,則可以使用多次exec方法,下一次搜索的位置從上一次匹配成功結(jié)束的位置開始。
var reg = /a/g;
var str = "abc_abc_abc"
var r1 = reg.exec(str);
r1 // ["a"]
r1.index // 0
reg.lastIndex // 1
var r2 = reg.exec(str);
r2 // ["a"]
r2.index // 4
reg.lastIndex // 5
var r3 = reg.exec(str);
r3 // ["a"]
r3.index // 8
reg.lastIndex // 9
var r4 = reg.exec(str);
r4 // null
reg.lastIndex // 0
連續(xù)用了四次exec方法,前三次都是從上一次匹配結(jié)束的位置向后匹配。當?shù)谌纹ヅ浣Y(jié)束以后,整個字符串已經(jīng)到達尾部,匹配結(jié)果返回null,正則實例對象的lastIndex屬性也重置為0,意味著第四次匹配將從頭開始。
g修飾符允許多次匹配的特點,可以用一個循環(huán)完成全部匹配。
var reg = /a/g;
var str = "abc_abc_abc"
while(true) {
var match = reg.exec(str);
if (!match) break;
console.log("#" + match.index + ":" + match[0]);
}
// #0:a
// #4:a
// #8:a
上面代碼中,只要exec方法不返回null,就會一直循環(huán)下去,每次輸出匹配的位置和匹配的文本。
4.字符串的實例方法
String.prototype.match():返回一個數(shù)組,成員是所有匹配的子字符串。
String.prototype.search():按照給定的正則表達式進行搜索,返回一個整數(shù),表示匹配開始的位置。
String.prototype.replace():按照給定的正則表達式進行替換,返回替換后的字符串。一個而已 有g才替換全部
String.prototype.split():按照給定規(guī)則進行字符串分割,返回一個數(shù)組,包含分割后的各個成員
String.prototype.match()
正則表達式帶有g修飾符,則該方法與正則對象的exec方法行為不同,會一次性返回所有匹配成功的結(jié)果。
var s = "_x_x";
var r1 = /x/;
var r2 = /y/;
s.match(r1) // ["x"]
s.match(r2) // null
設置正則表達式的lastIndex屬性,對match方法無效,匹配總是從字符串的第一個字符開始。
var r = /a|b/g;
r.lastIndex = 7;
"xaxb".match(r) // ["a", "b"]
r.lastIndex // 0
var s = "abba";
var r = /a/g;
s.match(r) // ["a", "a"]
r.exec(s) // ["a"]
String.prototype.search()
字符串對象的search方法,返回第一個滿足條件的匹配結(jié)果在整個字符串中的位置。如果沒有任何匹配,則返回-1。
"_x_x".search(/x/)
// 1
(2)String.prototype.replace()
正則表達式如果不加g修飾符,就替換第一個匹配成功的值,否則替換所有匹配成功的值。
"aaa".replace("a", "b") // "baa"
"aaa".replace(/a/, "b") // "baa"
"aaa".replace(/a/g, "b") // "bbb"
2.1replace方法的第二個參數(shù)可以使用美元符號$,用來指代所替換的內(nèi)容。
$&:匹配的子字符串。
$`:匹配結(jié)果前面的文本。
$":匹配結(jié)果后面的文本。
$n:匹配成功的第n組內(nèi)容,n是從1開始的自然數(shù)。
$$:指代美元符號$。
"hello world".replace(/(w+)s(w+)/, "$2 $1")
// "world hello"
"abc".replace("b", "[$`-$&-$"]")
// "a[a-b-c]c"
上面代碼中,第一個例子是將匹配的組互換位置,第二個例子是改寫匹配的值。
2.2replace方法的第二個參數(shù)還可以是一個函數(shù),將每一個匹配內(nèi)容替換為函數(shù)返回值
"3 and 5".replace(/[0-9]+/g, function (match) {
return 2 * match;
})
// "6 and 10"
var a = "The quick brown fox jumped over the lazy dog.";
var pattern = /quick|brown|lazy/ig;
a.replace(pattern, function replacer(match) {
return match.toUpperCase();
});
// The QUICK BROWN fox jumped over the LAZY dog.
作為replace方法第二個參數(shù)的替換函數(shù),可以接受多個參數(shù)。其中,第一個參數(shù)是捕捉到的內(nèi)容,第二個參數(shù)是捕捉到的組匹配(有多少個組匹配,就有多少個對應的參數(shù))。此外,最后還可以添加兩個參數(shù),倒數(shù)第二個參數(shù)是捕捉到的內(nèi)容在整個字符串中的位置(比如從第五個位置開始),最后一個參數(shù)是原字符串。下面是一個網(wǎng)頁模板替換的例子。
var prices = {
"p1": "$1.99",
"p2": "$9.99",
"p3": "$5.00"
};
var template = ""
""
"";
template.replace(
/()()/g,
function(match, $1, $2, $3, $4){
return $1 + $2 + $3 + prices[$2] + $4;
}
);
// "$1.99$9.99$5.00"
上面代碼的捕捉模式中,有四個括號,所以會產(chǎn)生四個組匹配,在匹配函數(shù)中用$1到$4表示。匹配函數(shù)的作用是將價格插入模板中。
String.prototype.split()
字符串對象的split方法按照正則規(guī)則分割字符串,返回一個由分割后的各個部分組成的數(shù)組。
str.split(separator, [limit])
該方法接受兩個參數(shù),第一個參數(shù)是正則表達式,表示分隔規(guī)則,第二個參數(shù)是返回數(shù)組的最大成員數(shù)。
// 非正則分隔
"a, b,c, d".split(",")
// [ "a", " b", "c", " d" ]
// 正則分隔,去除多余的空格
"a, b,c, d".split(/, */)
// [ "a", "b", "c", "d" ]
// 指定返回數(shù)組的最大成員
"a, b,c, d".split(/, */, 2)
[ "a", "b" ]
上面代碼使用正則表達式,去除了子字符串的逗號后面的空格。
// 例一
"aaaa".split(/a*/)
// [ "", "", "" ]
// 例二
"aaa*a".split(/a*/)
// ["", "", "", "*"]
上面代碼的分割規(guī)則是0次或多次的a,由于正則默認是貪婪匹配,所以例一的第一個分隔符是aaa,第二個分割符是a,將字符串分成三個部分,包含開始處的空字符串。例二的第一個分隔符是aaa,第二個分隔符是0個a(即空字符),第三個分隔符是a,所以將字符串分成四個部分。
如果正則表達式帶有括號,則括號匹配的部分也會作為數(shù)組成員返回。
"aaaa".split(/(a*)/)
// [ "", "aaa", "", "a", "" ]
上面代碼的正則表達式使用了括號,第一個組匹配是aaa,第二個組匹配是a,它們都作為數(shù)組成員返回。
(3)String.prototype.split()
5.匹配規(guī)則
字面量字符和元字符
轉(zhuǎn)義符
特殊字符
字符類
預定義模式
重復類
量詞符
貪婪模式
修飾符
組匹配
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/105974.html
摘要:返回值是被找到的值。支持正則表達式的對象的方法方法檢索與正則表達式相匹配的子字符串。該數(shù)組是通過在指定的邊界處將字符串分割成子串創(chuàng)建的。注意報錯正確示例附表修飾符修飾符描述執(zhí)行對大小寫不敏感的匹配。查找以十六進制數(shù)規(guī)定的字符。 什么是 RegExp? RegExp 是正則表達式的縮寫。 當您檢索某個文本時,可以使用一種模式來描述要檢索的內(nèi)容。RegExp 就是這種模式。 簡單的模式可以...
摘要:對象對象對象表示正則表達式,它是對字符串執(zhí)行模式匹配的強大工具。查找以十六進制數(shù)規(guī)定的字符。支持正則表達式的對象的方法方法描述檢索與正則表達式相匹配的值。替換與正則表達式匹配的子串。 RegExp對象 RegExp 對象 RegExp 對象表示正則表達式,它是對字符串執(zhí)行模式匹配的強大工具。 直接量語法 /pattern/attributes 創(chuàng)建 RegExp 對象的語法 new R...
摘要:直接調(diào)用構(gòu)造函數(shù)使用,一個可能含某種匹配模式的路徑字符串作為它的必選參數(shù),它返回一個正則對象。有兩個方法返回一個正則對象,效果與調(diào)用構(gòu)造函數(shù)一樣返回一個函數(shù),該函數(shù)與下面的返回的函數(shù)功能一樣方法,同樣接收一個路徑字符串。 code in here使用path-to-regexp,我們可以在路徑字符串中使用正則。如/:foo*/:bar?、/icon-:foo(d+).png等。像exp...
摘要:返回值一個新的對象,具有指定的模式和標志。參數(shù)作用正則表達式規(guī)定匹配的類型。如果未找到匹配,則返回值為。返回值請注意,無論是否是全局模式,都會把完整的細節(jié)添加到它返回的數(shù)組中。字符串或正則表達式,從該參數(shù)指定的地方分割。 前言 PS:2018/03/27 優(yōu)化文章格式,新增部分測試代碼說起正則其實大家都會經(jīng)常接觸到,前端小到校驗,大到插件隨處可見,簡單的方法也能實現(xiàn)需求,不過缺乏靈活性...
摘要:目錄導語理解正則表達式模式的規(guī)則字符串和正則實例的屬性和方法檢索實例小結(jié)導語正則表達式是處理字符串的一門藝術手法,應用場景經(jīng)常出現(xiàn)在表單驗證部分高級程序設計一書開篇提到,這門語言最原始的應用就是處理輸入驗證操作,所以正則表達式從誕生那一刻就 目錄 導語 1.理解正則表達式 2.模式的規(guī)則 3.字符串和正則實例的屬性和方法 4.檢索實例 5. 小結(jié) 導語 正則表達式是處理字符串的一門藝...
閱讀 466·2021-10-09 09:57
閱讀 470·2019-08-29 18:39
閱讀 811·2019-08-29 12:27
閱讀 3028·2019-08-26 11:38
閱讀 2667·2019-08-26 11:37
閱讀 1286·2019-08-26 10:59
閱讀 1377·2019-08-26 10:58
閱讀 989·2019-08-26 10:48