1. 程式人生 > >【正則】JavaScript正則表示式

【正則】JavaScript正則表示式

一、元字元

這裡寫圖片描述

二、修飾符

這裡寫圖片描述

三、屬性

這裡寫圖片描述

四、貪婪模式&&非貪婪模式

正則表示式會盡可能多的匹配,直到無法匹配,我們稱之為貪婪模式
下面的數字匹配會返回能匹配到的最多的數字

var str = "123456789";
str.replace(/\d{3,6}/, 'x'); //x789

非貪婪模式和貪婪模式正相反,會盡可能少的匹配,只要在量詞後面新增?即可變為非貪婪模式

var str = "123456789";
str.replace(/\d{3,6}?/, 'x'); //x456789

五、反向引用

可以通過$組數來引用分組匹配

var str = "1a2b3c4d";
str.replace(/\d(\S)/g, '$1'); //abcd

六、非捕獲性分組

分組可以通過()來表示,分組匹配到的資料會暫存起來,以便反向應用,然後 非捕獲性分組只用作匹配用,而不會把分組匹配到的資料暫存,能提高匹配速度,通過(?:)來表示非捕獲性分組

var str = "ab1cd2";
str.match(/(ab)+\d+(cd)+\d+/); //['ab1cd2', 'ab', 'cd']
str.match(/(?:ab)+\d+(?:cd)+\d+/); ['ab1cd2'] 無分組匹配的資訊

七、先行斷言(前瞻)&&後行斷言(後顧)

正則的匹配是從左到右進行匹配的,右邊被稱為先(前),左邊被稱為
先行斷言即當匹配到某個值後,向

檢查是否符合斷言,符合斷言的稱為先行斷言,符合的稱為先行否定斷言後行斷言正好相反

先行斷言:exp(?=assert)
先行否定斷言:exp(?!assert)

var str = "xyxaxy";
//只有當x右邊為y時才能匹配成功,且斷言不參與替換
str.replace(/x(?=y)/g, '1'); //1yxa1y

JS語言的正則表示式,只支援先行斷言和先行否定斷言,不支援後行斷言和後行否定斷言。ES2018 引入後行斷言,V8引擎4.9版(Chrome 62)已經支援。

後行斷言:(?<=assert)exp
後行否定斷言:(?<!assert)exp

var str = "xyxaxy";
//只有當y左邊為x時才能匹配成功,且斷言不參與替換
str.replace(/(?<=x)y/g, '1'); //x1xax1

八、方法

字串物件共有 4 個方法,可以使用正則表示式:match()replace()search()split()

正則物件有兩個方法可以匹配字串reg.test(str)reg.exec(str)

1.match -> str.match(reg)

match返回的是個陣列

  • 當非全域性搜尋時,陣列第一個值為匹配的文字,後面依次為分組匹配到的文字,非全域性搜尋時,match還會返回額外的屬性,index匹配文字的起始位置,input進行匹配的文字
  • 當為全域性搜尋時,返回的陣列為所有匹配到的文字
  • 未匹配到文字時,返回null
2.replace -> str.replace(reg, str|fun)

replace的替換值可以是個函式,函式接收的引數為

  • match 匹配到的文字
  • group1、group2.. 分組匹配的資訊,有多少分組傳入多少,如果沒有分組則無該引數
  • index 匹配到的文字位置
  • origin 進行匹配的文字
3.search -> str.search(reg)

search返回的是匹配到的文字的第一個字元位置,如果沒有匹配到,則返回-1,且每次呼叫時都是從文字的第一個字元開始匹配,即lastIndex總為0

4.test -> reg.test(str)

test返回的是個Boolean,即是否有匹配中的值,若匹配則返回true,否則返回false,test方法每次從上次lastIndex開始,即上次匹配文字的下一個字元開始進行查詢匹配

5.exec -> reg.exec(str)

exec和match方法類似,返回的是一個陣列

  • 陣列第一個值為匹配的文字,後面依次為分組匹配到的文字,會返回額外的屬性,index匹配文字的起始位置,input進行匹配的文字
  • 不支援全域性搜尋
  • 未匹配到文字時,返回null