JavaScript正則表達式基本使用記錄

概述

正則表達式是用于匹配字符串中字符組合的模式雌续,一般情況下會比循環(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
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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抗果,隨后出現(xiàn)的幾起案子筋帖,更是在濱河造成了極大的恐慌,老刑警劉巖冤馏,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件日麸,死亡現(xiàn)場離奇詭異,居然都是意外死亡逮光,警方通過查閱死者的電腦和手機代箭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涕刚,“玉大人嗡综,你說我怎么就攤上這事《拍” “怎么了蛤高?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碑幅。 經(jīng)常有香客問我戴陡,道長,這世上最難降的妖魔是什么沟涨? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任恤批,我火速辦了婚禮,結(jié)果婚禮上裹赴,老公的妹妹穿的比我還像新娘喜庞。我一直安慰自己,他們只是感情好棋返,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布延都。 她就那樣靜靜地躺著,像睡著了一般睛竣。 火紅的嫁衣襯著肌膚如雪晰房。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天射沟,我揣著相機與錄音殊者,去河邊找鬼。 笑死验夯,一個胖子當著我的面吹牛猖吴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挥转,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼海蔽,長吁一口氣:“原來是場噩夢啊……” “哼共屈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起党窜,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拗引,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后刑然,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寺擂,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年泼掠,在試婚紗的時候發(fā)現(xiàn)自己被綠了怔软。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡择镇,死狀恐怖挡逼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腻豌,我是刑警寧澤家坎,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站吝梅,受9級特大地震影響虱疏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苏携,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一做瞪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧右冻,春花似錦装蓬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乳蛾,卻和暖如春暗赶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屡久。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工忆首, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人被环。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像详幽,于是被迫代替她去往敵國和親筛欢。 傳聞我的和親對象是個殘疾皇子浸锨,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容