摘要:前置知識(shí)中的正則表達(dá)式是用來匹配字符串中指定字符組合的模式。另外需要記住正則表達(dá)式也是對(duì)象。在正則表達(dá)式創(chuàng)建時(shí)更新,不執(zhí)行。替換與正則表達(dá)式匹配的子串。查找以十六進(jìn)制數(shù)規(guī)定的字符。正則表達(dá)式拓展介紹在中有兩種情況。
本文是 重溫基礎(chǔ) 系列文章的第九篇。
今日感受:時(shí)間管理-角色管理法。
系列目錄:
【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理)
【重溫基礎(chǔ)】1.語法和數(shù)據(jù)類型
【重溫基礎(chǔ)】2.流程控制和錯(cuò)誤處理
【重溫基礎(chǔ)】3.循環(huán)和迭代
【重溫基礎(chǔ)】4.函數(shù)
【重溫基礎(chǔ)】5.表達(dá)式和運(yùn)算符
【重溫基礎(chǔ)】6.數(shù)字
【重溫基礎(chǔ)】7.時(shí)間對(duì)象
【重溫基礎(chǔ)】8.字符串
本章節(jié)復(fù)習(xí)的是JS中的正則表達(dá)式,JS中用來匹配字符串的強(qiáng)大工具。
前置知識(shí):
JS中的正則表達(dá)式是用來匹配字符串中指定字符組合的模式。
另外需要記?。赫齽t表達(dá)式也是對(duì)象。
使用一個(gè)正則表達(dá)式字面量:
let reg = /ab+c/; let reg = /^[a-zA-z]/gi;
使用RegExp對(duì)象:
new RegExp(str[, attr])接收2個(gè)參數(shù),str是一個(gè)字符串,指定正則表達(dá)式匹配規(guī)則,attr可選,表示匹配模式,值有g(全局匹配),i(區(qū)分大小寫的匹配)和m(多行匹配)。
let reg = new RegExp("ab+c"); let reg = new RegExp(/^[a-zA-z]/, "gi"); let reg = new RegExp("^[a-zA-z]", "gi");
正則表達(dá)式的返回值,是一個(gè)新的RegExp對(duì)象,具有指定的模式和標(biāo)志。
返回信息介紹:
對(duì)象 | 屬性 | 描述 | 案例中對(duì)應(yīng)的值 |
---|---|---|---|
reg | lastIndex | 下一個(gè)匹配的索引(僅在使用g參數(shù)時(shí)可用) | 0 |
reg | source | 模式文本。在正則表達(dá)式創(chuàng)建時(shí)更新,不執(zhí)行。 | "ab+c" |
reg | ignoreCase | 是否使用了 "i" 標(biāo)記使正則匹配忽略大小寫。 | true |
reg | global | 是否使用了 "g" 標(biāo)記來進(jìn)行全局的匹配。 | true |
reg | multiline | 是否使用了 "m" 標(biāo)記使正則工作在多行模式。 | false |
關(guān)于正則表達(dá)式的一些方法屬性,文章后面介紹,這里先復(fù)習(xí)定義和使用。
2.使用正則表達(dá)式JS的正則表達(dá)式可以被用于:
RegExp對(duì)象的exec和test方法;
String對(duì)象的match、replace、search和split方法。
2.1 RegExp對(duì)象方法方法 | 介紹 |
---|---|
exec | 檢索字符串中指定的值。返回找到的值,并確定其位置。 |
test | 檢索字符串中指定的值。返回 true 或 false。 |
str: 需要檢索的字符串。
若檢索成功,返回匹配的數(shù)組,否則返回null。
let str = "hello leo!"; let reg = new RegExp("leo", "g"); let result = reg.exec(str); // 也可以寫成 let result = /leo/g.exec("hello leo!"); /* [ 0: "leo", groups: undefined, index: 6, input: "hello leo!", length: 1 ] */ let result2 = /(leo S)/g.exec("hello leo hi leo!"); /* 0: "leo hi" 1: "leo hi" 2: "hi" groups: undefined index: 6 input: "hello leo hi leo!" length: 3 */
返回信息介紹:
對(duì)象 | 屬性 | 描述 | 案例中對(duì)應(yīng)的值 |
---|---|---|---|
result | [0] | 匹配到的所有字符串 | "leo" |
result | input | 初始字符串。 | "hello leo!" |
result | index | 在輸入的字符串中匹配到的以0開始的索引值。 | 6 |
result2 | [1],...,[n] | 括號(hào)中的分組捕獲 | [1]=> "leo hi";[2] => "hi" |
str:需要檢索的字符串。
若匹配成功返回true否則false。
等價(jià)于 reg.exec(str) != null。
let str = "hello leo!"; let res = /^leo/.test(str); // fasle let res1 = /^leo/.test(str); // true
^str表示匹配以str開頭的字符串,這些符號(hào)文章后面會(huì)介紹。
2.2 String對(duì)象方法方法 | 介紹 |
---|---|
search | 檢索與正則表達(dá)式相匹配的值。 |
match | 找到一個(gè)或多個(gè)正則表達(dá)式的匹配。 |
replace | 替換與正則表達(dá)式匹配的子串。 |
split | 把字符串分割為字符串?dāng)?shù)組。 |
str.search(reg):
str:被檢索的源字符串。
reg:可以是需要檢索的字符串,也可以是需要檢索的RegExp對(duì)象,可以添加標(biāo)志,如i。
若檢索成功,返回第一個(gè)與RegExp對(duì)象匹配的字符串的起始位置,否則返回-1。
let str = "hello leo!"; let res = str.search(/leo/g); // 6 let str1 = "hello leoleoleoleo!"; let res1 = str.search(/leo/g); // 6 let res2 = str.search(/pingan/g); // -12.2.2 match
str.match(reg):
str:被檢索的源字符串。
reg:可以是需要檢索的字符串,也可以是需要檢索的RegExp對(duì)象,可以添加標(biāo)志,如i。
若檢索成功,返回與reg匹配的所有結(jié)果的一個(gè)數(shù)組,數(shù)組的第一項(xiàng)是進(jìn)行匹配完整的字符串,之后的項(xiàng)是用圓括號(hào)捕獲的結(jié)果,否則返回null。
let str = "For more information, see Chapter 3.4.5.1"; let reg = /see (chapter d+(.d)*)/i; let result = str.match(reg); /* logs [ "see Chapter 3.4.5.1", "Chapter 3.4.5.1", ".1", index: 22, input: "For more information, see Chapter 3.4.5.1" ] */
"see Chapter 3.4.5.1" 是整個(gè)匹配。
"Chapter 3.4.5.1" 被"(chapter d+(.d)*)"捕獲。
".1" 是被"(.d)"捕獲的最后一個(gè)值。
"index" 屬性(22) 是整個(gè)匹配從零開始的索引。
"input" 屬性是被解析的原始字符串。
將字符串中指定字符替換成其他字符,或替換成一個(gè)與正則表達(dá)式匹配的字符串。
str.replace(sub/reg,val):
str: 源字符串
sub: 使用字符串來檢索被替換的文本
reg: 使用RegExp對(duì)象來檢索來檢索被替換的文本
val: 指定替換文本
返回替換成功之后的字符串,不改變?cè)醋址畠?nèi)容。
let str = "hello leo!"; let res = str.replace("leo","pingan");//"hello pingan!"
val可以使用特殊變量名:
變量名 | 代表的值 |
---|---|
$$ | 插入一個(gè) "$"。 |
$& | 插入匹配的子串。 |
$ | 插入當(dāng)前匹配的子串左邊的內(nèi)容。 |
$" | 插入當(dāng)前匹配的子串右邊的內(nèi)容。 |
$n | 假如第一個(gè)參數(shù)是 RegExp對(duì)象,并且 n 是個(gè)小于100的非負(fù)整數(shù),那么插入第 n 個(gè)括號(hào)匹配的字符串。提示:索引是從1開始 |
let str = "hello leo!"; let res = str.replace(/(w+)s* s*(w+)/, "$2:$1"); // "leo:hello!"2.2.4 split
將一個(gè)字符串,按照指定符號(hào)分割成一個(gè)字符串?dāng)?shù)組。
str.split(sub[, maxlength]):
str: 源字符串
sub: 指定的分割符號(hào)或正則
maxlength: 源字符串
let str = "hello leo!"; let res = str.split(); //["hello leo!"] let res = str.split(""); //["h", "e", "l", "l", "o", " ", "l", "e", "o", "!"] let res = str.split(" ");//["hello", "leo!"] let res = str.split(/s+/);//["hello", "leo!"] let res = str.split("",3);//["h", "e", "l"]2.3 使用情況
當(dāng)我們想要查找一個(gè)字符串中的一個(gè)匹配是否找到,可以用test或search方法。
當(dāng)我們想要得到匹配的更多信息,我們就需要用到exec或match方法。
3.正則表達(dá)式符號(hào)介紹詳細(xì)的每個(gè)符號(hào)的用法,可以查閱 W3school JavaScript RegExp 對(duì)象
3.1 修飾符修飾符 | 描述 |
---|---|
i | 執(zhí)行對(duì)大小寫不敏感的匹配。 |
g | 執(zhí)行全局匹配(查找所有匹配而非在找到第一個(gè)匹配后停止)。 |
m | 執(zhí)行多行匹配。 |
let str = "hello leo!" let res = /Leo/i.test(str); // i 不區(qū)分大小寫 所以返回true let res = /Leo/.test(str); // fasle3.2 方括號(hào)
用于查找指定返回之內(nèi)的字符:
表達(dá)式 | 描述 |
---|---|
[abc] | 查找方括號(hào)之間的任何字符。 |
[^abc] | 查找任何不在方括號(hào)之間的字符。 |
[0-9] | 查找任何從 0 至 9 的數(shù)字。 |
[a-z] | 查找任何從小寫 a 到小寫 z 的字符。 |
[A-Z] | 查找任何從大寫 A 到大寫 Z 的字符。 |
[A-z] | 查找任何從大寫 A 到小寫 z 的字符。 |
[adgk] | 查找給定集合內(nèi)的任何字符。 |
[^adgk] | 查找給定集合外的任何字符。 |
(red) | 查找任何指定的選項(xiàng)。 |
let str = "hello leo!"; let res = str.match(/[a-m]/g); //["h", "e", "l", "l", "l", "e"] let res = str.match(/[^a-m]/g); //["o", " ", "o", "!"]3.3 元字符
元字符是擁有特殊含義的字符:
元字符 | 描述 |
---|---|
. | 查找單個(gè)字符,除了換行和行結(jié)束符。 |
w | 查找單詞字符。 |
W | 查找非單詞字符。 |
d | 查找數(shù)字。 |
D | 查找非數(shù)字字符。 |
s | 查找空白字符。 |
S | 查找非空白字符。 |
匹配單詞邊界。 | |
B | 匹配非單詞邊界。 |