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