JavaScript正則爬坑

東東dd發表於2018-09-24

語法

直接量字元

  • \t 製表符
  • \r 回車
  • \n 換行

字元類

  • [...] 方括號內的任意字元
  • [^...]非方括號內的任意字元
  • . 除換行符和其它Unicode行終止符之外的任意字元
  • \w 等同於[a-zA-Z0-9]
  • \W 等同於[^a-zA-Z0-9]
  • \s Unicode空白符
  • \S 空白符之外的字元
  • \d 等同於[0-9]
  • \D [^0-9]

/[\s\d]/ 任意空白符和數字

重複字元語法

  • {n,m} 匹配前一項至少n次,但不能超過m次
  • {n,} 匹配前一項n次或者更多次
  • {n} 匹配前一項n次
  • ? 相當於{0,1}
    • 相當於{1,}
    • 相當於{0,}

/\d{2,3}/ 匹配2-3個數字
/\w{3}\d?/ 匹配三個單詞和一個可選的數字
/\s+java\s+/ 匹配前後帶至少一個空格的java
/[^(]*/ 匹配任意個非(字元
預設為貪婪匹配,當在重複字元後面加上?時候為非貪婪匹配

'|' 的作用

用於分割供選擇的字串
/ab|cd|ef/ 匹配 'ab' 或者 'cd' 或者 'ef'
/\d{3}|[a-z]{4}/ 匹配三位數字或者四個小寫字母

()的作用

將單獨的項組合成子表示式,以便可以像處理一個獨立的單元那樣用'|', '+', '*', '?'進行處理,同樣可以取得與括號中正常匹配的內容,在正規表示式中也可以通過\後面加上數字的形式重複引用,注意這裡的數字是對應的子表示式左括號的位置(理解為對錶達式進行分組,每組對應有下標,下標的值為當前組左括號在表示式中的位置,使用\1這樣的語法表示的是其內容和前面所匹配的內容完全相同,並不是使用相同的規則匹配)
/java(script)?/ 匹配'java'或者'javascript'
/(ab|cd)+|ef/ 匹配ef或者ab cd的重複
/(['"])[^'"]\1/ 匹配單引號或雙引號括起來的內容

(?:)與()的作用大致相同,但不生成引用,所以不發通過\加下標的形式訪問到,也不佔用下標位置

  • ^ 匹配字串的開頭
  • $ 匹配字串的結尾
  • \b 單詞的邊界
  • \B 非單詞的邊界

修飾符

  • i 用以說明不區分大小寫
  • g 匹配模式為全域性模式,即找出所有的匹配
  • m 在多行模式中執行匹配

方法

String方法

String.search()

返回第一個與之匹配的字串的起始位置,若沒匹配到就返回-1,也可以直接傳入字串匹配
"JavaScript".search(/java/i) 返回0

String.replace()

執行檢索並替換,第一個引數是正則或者字串,第二個引數為要替換成的字串
'Javascript'.replace(/script/,'Script')
如果在被替換字串中出現了'$'加數字,那麼replace將用與指定的子表示式相匹配的文字來替換這兩個字串
text.replace(/"([^"]*)"/g,'“$1”')降""替換成“”

String.match()

唯一的引數是一個正規表示式
如果正規表示式是全域性匹配則返回所有匹配結果組成的陣列
如果不是,則返回的值第一個值是匹配的字串,後面則返回分組匹配的內容

var url = /(\w+):\/\/([\w.]+)\/(\S*)/
var text = "welcome to http://www.test.com/index.html"
var res = text.match(url);
if (res !== null) {
    console.log(res[0]) //http://www.test.com/index.html
    console.log(res[1]) //http
    console.log(res[2]) //www.test.com
    console.log(res[3]) //index.html
}
複製程式碼

String.split()

降字串按規則拆分成陣列,可以是字串和正規表示式

"1,2,3,4,5,6".split(',') //[1,2,3,4,5,6]
"1, 2 ,3,  4,5 ,6".split(/\s*,\s*/) // [1,2,3,4,5,6]

複製程式碼

RegExp物件

使用方法 var zipcode = new RegExp('\\d{5}','g')

屬性

  • RegExp.source 只讀,包含正規表示式的文字
  • RegExp.global 只讀,是否帶有修飾符g
  • RegExp.ignoreCase 只讀,是否帶有修飾符i
  • RegExp.multiline 只讀,是否帶有修飾符m
  • RegExp.lastIndex 可讀/寫,如果匹配模式帶有g修飾符,這個屬性儲存在整個字串下一次檢索的開始位置

方法

  • RegExp.exec(string)

和String.match相似,如果沒有匹配上返回null,反則返回一個陣列,返回規則與String.match相同

var url = new RegExp('(\\w+):\/\/([\\w.]+)\/(\\S*)')
var text = "welcome to http://www.test.com/index.html"
var res = url.exec(text);
if (res !== null) {
    console.log(res[0]) //http://www.test.com/index.html
    console.log(res[1]) //http
    console.log(res[2]) //www.test.com
    console.log(res[3]) //index.html
}
複製程式碼

和match不同的是無論是否具有全域性修飾符g,exec都只會返回一個匹配結果和本次匹配的完整資訊,並將lastIndex指向緊接著匹配子串的字元位置,當第二次呼叫時,它會從lastIndex開始匹配,如果沒有發現匹配會將lastIndex設定為0

  • RegExp.test(string)

對字串進行檢測,如果包含匹配結果則返回true

var pattern = new RegExp('java','i');
console.log(pattern.test('java111')) //true
console.log(pattern.test('ja1va111')) // false
複製程式碼

後續整理一部分常用的正規表示式,學習中進步~~~

相關文章