概述
正則表達式是用于匹配字符串中字符組合的模式雌续,一般情況下會比循環(huán)查詢匹配效率要高斩个,代碼也更加簡潔。能使用正則的方法總結(jié)如下驯杜。
方法總結(jié)
String
1受啥、search
2、match
3、matchAll
4滚局、replace
5居暖、split
使用
search
- str.search(regexp)
- regexp: 一個正則表達式,或者一個字符串(會自動調(diào)用
new RegExp(str)
轉(zhuǎn)成正則對象) - return: 返回正則表達式在字符串中首次匹配項的索引藤肢;否則太闺,返回 -1。
console.log("abcde".search(/bc/)); // 1
console.log("abcde".search(/bcdef/)); // -1
match
- str.match(regexp)
- regexp: 一個正則表達式對象嘁圈,或者一個字符串(會自動調(diào)用
new RegExp(str)
轉(zhuǎn)成正則對象) - return:
["result", index: 0, input: "inputStr", groups: undefined]
這里有三種情況- 參數(shù)
regexp
不傳的情況:["", index: 0, input: "inputStr", groups: undefined]
- 正則未使用
g
標志:僅返回第一個完整匹配及其相關(guān)其他屬性跟束。如:["bc", index: 1, input: "abcdebcd", groups: undefined]
或者返回null
- 正則使用了
g
標志:則返回全部匹配到的結(jié)果,并放于數(shù)組中丑孩。如:["abcd", "axxd"]
或者返回null
- 參數(shù)
console.log("abcde".match()); //["", index: 0, input: "abcde", groups: undefined]
console.log("abcdebcd".match(/bc/)); //["bc", index: 1, input: "abcdebcd", groups: undefined]
console.log("abcdeabcd".match(/a(bc)(d)/)); //["abcd", "bc", "d", index: 0, input: "abcdeabcd", groups: undefined]
console.log("abcdeabcd".match(/a(\w{2})(d)/)); //["abcd", "bc", "d", index: 0, input: "abcdeabcd", groups: undefined]
console.log("abcdeaxxd".match(/a(\w{2})(d)/g)); //["abcd", "axxd"]冀宴,括號將不會被記錄
-
groups
: -
index
: 匹配的結(jié)果的開始位置 -
input
: 搜索的字符串
matchAll
- str.matchAll(regexp)
- regexp: 一個正則表達式對象(MDN介紹必須使用
g
標志,但是測試發(fā)現(xiàn)貌似可以不必使用g
標志)温学,或者一個字符串(會自動調(diào)用new RegExp(str)
轉(zhuǎn)成正則對象) - return: 返回一個遍歷器略贮。其中每個又和
str.match
返回值相同。
replace
- str.replace(regexp | substr, newSubStr | function)
- regexp | substr: 一個要匹配的正則對象或者一個字符串
- newSubStr | function: 一個用于替換被匹配到的字符串或者一個方法仗岖,返回替換被匹配到的字符串的字符串
- return: 返回一個被替換后的新的字符串逃延,不影響老的字符串。
"abcde".replace("ab", "xx"); //xxcde
"abcde23".replace(/\d/, "f"); //abcdef3
"abcde23".replace(/\d/g, "f"); //abcdeff
split
- str.split([separator[, limit]])
- separator: 分隔符字符串轧拄,可以不傳遞
- limit: 限制返回值中分割元素數(shù)量
- return: 被分割后的數(shù)組
MDN介紹: 當字符串為空時揽祥,
split()
返回一個包含一個空字符串的數(shù)組,而不是一個空數(shù)組檩电,如果字符串和分隔符都是空字符串拄丰,則返回一個空數(shù)組。
但是經(jīng)過測試發(fā)現(xiàn)俐末,都是返回空字符串數(shù)組[""]
"abc".split(); //["abc"]
"abc".split(""); //["a", "b", "c"]
"abc".split("b"); //["a", "c"]
"abc".split("", 2); //["a", "b"]
RegExp
1料按、test
2、exec
兩個方法都有可能會改變lastIndex
卓箫,當使用g
標志的時候
使用
test
- regexpObj.test(str)
- str: 被用來測試的目標字符串
- return:
regexpObj
中的規(guī)則在str
中包含载矿,則返回true
否則返回false
let reg = /bc/;
const str = "abcd";
reg.test(str); // true reg.lastIndex = 0
reg.test(str); // true reg.lastIndex = 0
//如果正則規(guī)則中包含`g`標志,則會改變lastIndex屬性烹卒,重復(fù)測試的時候闷盔,后續(xù)會從lastIndex位置開始
let reg2 = new RegExp(/bc/, "g");
const str2 = "abcde";
reg2.test(str2); // true reg2.lastIndex = 3
reg2.test(str2); //false reg2.lastIndex = 0
reg2.test(str2); // true reg2.lastIndex = 3
exec
- regexObj.exec(str)
- str: 用于匹配正則表達式的字符串
- return: 和
String
中的match
方法不使用g
標志的返回值完全相同。當使用標志g
的時候旅急,重復(fù)調(diào)用會根據(jù)改變后的lastIndex位置開始查找并返回相同的數(shù)組逢勾。
let reg = /e/;
const str = "abcdefghee";
reg.exec(str); //["e", index: 4, input: "abcdefghee", groups: undefined]
console.log(reg.lastIndex); //0
reg.exec(str); //["e", index: 4, input: "abcdefghee", groups: undefined]
console.log(reg.lastIndex); //0
//當使用了 g 標志
let reg2 = /e/g;
const str2 = "abcdefghee";
reg2.exec(str2); //["e", index: 4, input: "abcdefghee", groups: undefined] reg2.lastIndex = 5
reg2.exec(str2); //["e", index: 8, input: "abcdefghee", groups: undefined] reg2.lastIndex = 9
//最后一次匹配后,下一次匹配會返回 null坠非,之后又從第0個下標開始查找
正則匹配的標志
1敏沉、i
: 匹配時不區(qū)分大小寫。即:a
也能匹配A
。
2盟迟、m
: 多行匹配秋泳。
3、g
: 全局匹配攒菠,匹配到第一次后不會停止迫皱,會繼續(xù)向后經(jīng)可能多的匹配。
常用元字符/表達式查詢
字符 | 作用 |
---|---|
\ |
轉(zhuǎn)義字符辖众。\d 表示匹配數(shù)字[0-9] 卓起,\( 表示匹配(
|
. |
匹配除換行符之外的任何單個字符。/T.m/ 將匹配"Tom, Tim, tem" 中的"Tom", "Tim"
|
* |
匹配之前的字符0次或者多次凹炸。/ab*/ 將匹配"abcdaebabb" 中的"ab", "a", "abb" 戏阅,相當于/ab{0, n}/
|
+ |
匹配之前字符1次或者多次。/ab+/ 將匹配"abcdaebabb"中的"ab", "abb" 啤它,相當于/ab{1,}
|
? |
匹配之前字符0次或者1次奕筐。/ab?/ 將匹配"abcdaebabb"中的"ab", "a", "ab" ,相當于/ab{0, 1}
|
? |
如果緊跟在任何量詞 *变骡、 +离赫、? 或 {} 的后面,將會使量詞變?yōu)榉秦澙返模ㄆヅ浔M量少的字符)塌碌,和缺省使用的貪婪模式(匹配盡可能多的字符)正好相反渊胸。例如,對 "123abc" 應(yīng)用 /\d+/ 將會返回 "123" 台妆,如果使用 /\d+?/ ,那么就只會匹配到 "1" 翎猛。 |
{n} |
匹配n 次 |
{n, m} |
匹配n 次到m 次 |
[xyz] [a-z] |
匹配中括號中的任意一個都成立 |
[^xyz] [^a-z] |
匹配中除去括號中的其他所有 |
x|y |
匹配x 或者y 。/red|green/ 將匹配"red"或"green" 频丘,而/re(d|g)een/ 將匹配"redeen"或"regeen" 并且括號中的匹配會被記住 |
(x) |
匹配x 并且會被記住办成,如果使用match 匹配,則會放置在匹配后的數(shù)組的下標為1 的位置 |
(?:x) |
非捕獲括號搂漠。匹配 x 但是不記住匹配項,和(x) 有區(qū)別 |
x(?=y) |
非捕獲括號某弦。匹配x 且后邊必須緊跟y 桐汤,但是結(jié)果只有x ,不會有y 也不會記錄y 靶壮。如:"HelloWorld".match(/Hello(?=World)/); 只會返回["Hello", index: 0, input: "HelloWorld", groups: undefined] 不會有"HelloWorld" 也不會記錄"World"
|
(?<=y)x |
非捕獲括號怔毛。匹配x 且前邊必須是y ,但是結(jié)果只有x 腾降。 |
x(?!y) |
非捕獲括號拣度。匹配x 且后邊必須不是y 。 |