1-1 正則表達式簡介及工具使用
什么是正則表達式
Regular Expression使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串搜索模式。
正則表達式工具
本地: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]把字符a或b或c歸為一類,表達式可以匹配這類字符
'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.

邊界


'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}

替換小寫字母+數(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)

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 。