JavaScript正則表達式

1-1 正則表達式簡介及工具使用

什么是正則表達式

Regular Expression 使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串搜索模式。

正則表達式工具

在線:https://regexper.com

本地:https://github.com/javallone/regexper-static

2-1 RegExp對象

字面量
  • var reg = /\bis\b/g;
 var reg = /\bis\b/g

 console.log('He is a boy.Where is he'.replace(reg,'Is')) // He Is a boy.Where Is he

\b:單詞邊界。
g:全文搜索匹配。

構造函數(shù)
  • var reg= new RegExp('\bis\b','g')
var reg= new RegExp('\\bis\\b','g')
console.log('He is a boy.Where is he'.replace(reg,'Is')) // He Is a boy.Where Is he
修飾符
  • g:global 全文搜索,不添加的話搜索到第一個匹配停止
  • i:ignore case 忽略大小寫,默認大小寫敏感
  • m:multiple lines 多行搜索
'He is a boy.Is he?'.replace(/\bis\b/g,'A') // "He A a boy.Is he?"

'He is a boy.Is he?'.replace(/\bis\b/gi,'A') // "He A a boy.A he?"

2-2 元字符

在正則表達式中有特殊含義的非字母字符




https://www.runoob.com/regexp/regexp-metachar.html

2-3 字符類

  • 我們可以使用元字符[]來構造一個簡單的類

  • 所謂類就是符合某些特性的對象,一個泛指,而不是某個特定字符

  • 表達式[abc]把字符abc歸為一類,表達式可以匹配這類字符

'a1b2c3d4'.replace(/[abc]/g,'X') // "X1X2X3d4"
字符類取反
  • 使用元字符^創(chuàng)建反向類/負向類

  • 反向類的意思是不屬于某類內(nèi)容

  • 表達式[^abc]表示不是字符a或b或c的內(nèi)容

'a1b2c3d4'.replace(/[^abc]/g,'X') // "aXbXcXXX"

2-4 范圍類

  • 正則表達式還提供了范圍類

  • 我們可以使用[a-z]來連接兩個字符表示從a到z的任意字符

  • 這是個閉區(qū)間,也就是包含a和z本身

'a1b2c3d4z9'.replace(/[a-z]/g,'Q') // "Q1Q2Q3Q4Q9"
  • []中可以連寫 [a-zA-Z]
'a1b2c3d4z9ADDFGGDWW'.replace(/[a-zA-Z]/g,'Q') // "Q1Q2Q3Q4Q9QQQQQQQQQ"
'2019-02-11'.replace(/[0-9]/g,"A") // "AAAA-AA-AA"

'2019-02-11'.replace(/[0-9-]/g,"A") // "AAAAAAAAAA"

2-5 預定義類及邊界

預定義類



例:
匹配一個ab+數(shù)字+任意字符的字符串

ab\d.

ab\d.

邊界

'This is a boy'.replace(/\bis\b/g,'A') // "This A a boy"

'@asdfg@vbbdd@'.replace(/^@./g,'Q') // "Qsdfg@vbbdd@"

'@asdfg@vbbdd@'.replace(/.@$/g,'Q') // "@asdfg@vbbdQ"

2-6 量詞

2-7 貪婪模式與非貪婪模式

貪婪模式

默認為貪婪模式

'12345678'.replace(/\d{3,6}/g,'X') // "X78"
非貪婪模式
  • 讓正則表達式盡可能少的匹配,匹配成功就不再繼續(xù)嘗試
  • 做法很簡單,就是在量詞后面加上?即可
 '12345678'.replace(/\d{3,6}?/g,'X') // "XX78"

2-8 分組

使用()達到分組的功能,使量詞作用于分組。

byron{3}


byron{3}

(byron){3}


(byron){3}

替換小寫字母+數(shù)字連續(xù)出現(xiàn)三次的場景:

'a1b2c3d4kjhgg'.replace(/([a-z]\d){3}/,'X') // "Xd4kjhgg"
反向引用
'2019-02-11'.replace(/(\d{4})-(\d{2})-(\d{2})/,'$2/$3/$1') // "02/11/2019"
忽略分組

不需要捕獲某分組,只需在分組內(nèi)加上?:就可以

(byron).(ok)


(byron).(ok)

(?:byron).(ok)


(?:byron).(ok)

2-9 前瞻

'a2*3'.replace(/\w(?=\d)/,'X') // "X2*3"

'a2*34v8'.replace(/\w(?=\d)/g,'X') // "X2*X4X8"

2-10 與正則相關的正則對象屬性

  • global:是否全局搜索,默認false
  • ignore case:是否大小寫敏感,默認false
  • multiline:多行搜索,默認false
  • lastIndex:當前表達式匹配內(nèi)容的最后一個字符的下一個位置
  • source:正則表達式的文本字符串

注:這幾個屬性是只讀的,不能對其設值

    var reg1 = /\w/
    var reg2 = /\w/igm

    console.log(reg1.global) // false

    console.log(reg1.ignoreCase) // false

    console.log(reg1.multiline) // false

    console.log(reg1.source) // \w

    console.log(reg2.global) // true

    console.log(reg2.ignoreCase) // true

    console.log(reg2.multiline) // true

    console.log(reg2.source) // \w

2-11 test和exec方法

RegExp.prototype.text(str)

test()方法執(zhí)行一個檢索,用來查看正則表達式與指定的字符串是否匹配。返回 true 或 false。

    var reg = /\w/g

    while(reg.test('ab')){
        console.log(reg.index)

    }

如果正則表達式設置了全局標志,test() 的執(zhí)行會改變正則表達式 lastIndex屬性。連續(xù)的執(zhí)行test()方法,后續(xù)的執(zhí)行將會從 lastIndex 處開始匹配字符串,(exec() 同樣改變正則本身的 lastIndex屬性值).

RegExp.prototype.exec(str)

如果匹配成功,exec() 方法返回一個數(shù)組(包含額外的屬性 index 和 input ,參見下方表格),并更新正則表達式對象的 lastIndex 屬性。完全匹配成功的文本將作為返回數(shù)組的第一項,從第二項起,后續(xù)每項都對應正則表達式內(nèi)捕獲括號里匹配成功的文本。

如果匹配失敗,exec() 方法返回 null,并將 lastIndex 重置為 0 。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容