RegExp對象實例化
RegExp是JS的正則表達式對象,實例化一個RegExp對象有字面量和構造函數2種方式。
字面量實例化RegExp對象
var reg=/js/gi;
開始和結束的斜線/是正則表達式的邊界,//中間的文本是正則表達式文本,后面的gi是正則表達式的修飾符。
構造函數實例化RegExp對象
var reg=new Regex(‘js’,’gi’);
第一個參數是正則表達式文本,第二個參數是正則表達式修飾符。
RegExp對象屬性
global:RegExp 對象是否具有標志 g。
ignoreCase:RegExp 對象是否具有標志 i。
lastIndex:一個整數,標示開始下一次匹配的字符位置。
multiline:RegExp 對象是否具有標志 m。
source:正則表達式的源文本。
RegExp對象的方法
RegExp 對象有 3 個方法:test()、exec() 以及 compile()。
test()
test() 方法檢索字符串中的指定值。返回值是 true 或 false。
示例:
var reg=/js/gi;
var result=reg.test(‘I like js’);
結果:true
exec()
exec() 方法檢索字符串中的指定值。返回值是被找到的值。如果沒有發現匹配,則返回 null。
示例:
var reg=/js/gi;
var result=reg.exec(‘I like JS’);
結果:JS
特別注意,上面的test()和exec()方法執行第一次結果正確的,第二次是錯誤的,第三次又是正確的。
因為表達式在使用 “g” 參數時,查找工作原理如下:
找到第一個 “JS”,并存儲其位置,即給RegExp對象lastIndex屬性賦值
如果再次運行,則從存儲的位置(lastIndex屬性 )開始檢索,發現后面已經找不到,然后又重頭開始查找,并找到下一個 “JS”,并存儲其位置
簡單的說JS正則表達式在全文搜索模式會使用一個類似取隊列中元素的執行過程,最后一次執行結果肯定是不正確,為避免這個隱藏的坑,建議大家使用test()和exec()方法時不要加g修飾符。
compile()
compile() 方法用于改變 RegExp。
compile() 既可以改變檢索模式,也可以添加或刪除第二個參數。
修飾符
g:global全文搜索,如果不添加此參數,搜索到第一個匹配就會停止
i:ignore case 不區分大小寫,默認是區分大小寫的
m:multiple lines 多行搜索,默認只搜索第一行
元字符
正則表達式文本部分包含原義文本字符和元字符,其中的原義文本字符代表字符本身意義的字符,如abc123之類的字符。
元字符代表有特殊含義非字母字符,如\b、\w、\d、+、*、? 等。
常用的元字符
字符 | 含義 | 字符 | 含義 |
---|---|---|---|
\d | 匹配任何數字字符。 | + | 限定符前的子模式必須出現1或多次。 |
? | 限定符前的子模式必須出現0或1次。 | . | 匹配任何字符,換行符除外。 |
^ | 字符串需以模式起始。 | | | 讓模式指定一連串可供選擇的子模式。 |
$ | 字符串需以模式結束。 | \s | 匹配空格(包括空白字符、tab、換行符、return/enter) |
* | 限定符前的子模式必須出現0或多次。 | \W | 匹配任何非單詞字符。等價于 ‘[^A-Za-z0-9_]’。 |
更多的JS正則元字符請參考:http://www.runoob.com/regexp/regexp-metachar.html
字符類
一般情況下正則表達式中的一個字符對應字符串中的一個字符,如表達式ab的含義是ab。
表達式中用[]來定義一個字符類,表示可以匹配[]里面的這類字符,是一個泛指,而不是一一對應的關系。
如表達式[abc123],表示有其中一個字符串都可以匹配。
范圍類
在字符類里面使用橫線-連接2個數字或者字母就可以構建一個范圍類,如[a-zA-z0-9-]表示可以匹配26個大小寫字母和0-9的全部數字以及橫線-。
注意,要匹配橫線”-“,必須把橫線放在最后面。
預定義類
預定義類可以理解為JS默認給我們寫好的范圍類,讓我們可以使用一個簡單的元字符來使用它。如”\w”就是一個預定義類,它等價于范圍類[A-Za-z0-9_];“.”可以匹配除 “\n” 之外的任何單個字符。
邊界
邊界包含2種,一種是以字符串開始或結尾的邊界,另一種是單詞邊界
字符 | 含義 | 字符 | 含義 |
---|---|---|---|
^ | 以xxx開始 | \b | 單詞邊界 |
$ | 以xxx結尾 | \B | 非單詞邊界 |
量詞
量詞表示可以匹配連續多次的元字符
字符 | 含義 | 字符 | 含義 |
---|---|---|---|
? | 出現0次或1次(最多1次) | + | 出現1次或多次(至少1次) |
* | 出現0次或多次(任意次) | {n} | 出現n次 |
{n,} | 至少出現n次 | {n,m} | 出現n次到m次范圍之間 |
貪婪模式和非貪婪模式
JS正則表達式默認是貪婪模式匹配,它會以最多匹配原則進行查找,非貪婪模式可以讓表達式以最少匹配原則進行查找。
非貪婪模式只需要在量詞后面加上”?”即可,如”123456789″字符串想以3個數字為一組進行匹配表達式寫法/\d{3,5}?/g。
分組
表達式中用()來定義一個分組,使元字符可以作用于一個表達式字符串組合,如/(js|php){3}/gi。
表達式中的每一個分組匹配的內容都是一個可以捕獲的變量,可以使用$1、$2、$3… 來取值,如表達式/(\d{4})-(\d{2})-(\d{2})/中包含$1、$2、$3。如果想忽略分組匹配的內容,需要在分組前面增加“?:”,就可以得到分組匹配之外的內容。
前瞻
前瞻就是正則表達式后面加上斷言部分,它不但要匹配表達式部分,還需要滿足斷言部分,匹配的結果不會包含斷言部分。
正向前瞻 exp(?=assert) 如 “\w(?=\d)”
負向前瞻 exp(?!assert) 如 “\w(?!\d)”
JS正則表達式其它相關字符串處理函數
match()
stringObject.match(regexp)
match() 方法可在字符串內檢索指定的值,或找到一個或多個正則表達式的匹配。
如果 regexp 沒有標志 g,那么 match() 方法就只能在 stringObject 中執行一次匹配。
如果沒有找到任何匹配的文本, match() 將返回 null。
否則,它將返回一個數組,其中存放了與它找到的匹配文本有關的信息。該數組的第 0 個元素存放的是匹配文本,而其余的元素存放的是與正則表達式的子表達式匹配的文本。
search()
stringObject.search(regexp)
search() 方法不執行全局匹配,它將忽略標志 g。它同時忽略 regexp 的 lastIndex 屬性,并且總是從字符串的開始進行檢索,這意味著它總是返回 stringObject 的第一個匹配的位置。
replace()
stringObject.replace(regexp/substr,replacement)
字符串 stringObject 的 replace() 方法執行的是查找并替換的操作。它將在 stringObject 中查找與 regexp 相匹配的子字符串,然后用 replacement 來替換這些子串。如果 regexp 具有全局標志 g,那么 replace() 方法將替換所有匹配的子串。否則,它只替換第一個匹配子串。
replacement 可以是字符串,也可以是函數。如果它是字符串,那么每個匹配都將由字符串替換。但是 replacement 中的 $ 字符具有特定的含義。如下表所示,它說明從模式匹配得到的字符串將用于替換。
split()
stringObject.split(separator,howmany)
如果 separator 是包含子表達式的正則表達式,那么返回的數組中包括與這些子表達式匹配的字串(但不包括與整個正則表達式匹配的文本)
正則表達式語法語意測試工具:https://regexper.com/