JavaScript 正則表達式筆記

Regular Expression 使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。
按某種規則去匹配符合條件的字符串。不一樣編程語言的正則表達式略有不一樣。javascript

圖形工具(正則表達式在線工具):http://regexper.comjava

1、語法

JavaScript經過內置對象 RegExp 支持正則表達式,有兩種方法實例化RegExp對象:字面量和構造函數。git

1. 字面量

// 實例化一個正則表達式,匹配字符串中的is單詞
var reg = /\bis\b/g;

'She is girl, This is a computer.'.replace(reg, 'IS');
// 結果 'She IS girl, This IS a computer.'

2. 構造函數

var reg = new RegExp('\\bis\\b', 'g'); 
'She is girl, This is a computer.'.replace(reg, 'IS');
// 結果 'She IS girl, This IS a computer.'

2、元字符

正則表達式由兩種基本字符類型組成:原義文本字符和元字符。元字符是在正則表達式中有特殊含義非字母字符。github

* + $ ^ . | \ () {} []
字符 含義 字符 含義
\t 水平製表符 \v 垂直製表符
\n 換行符 \r 回車符
\0 空字符 \f 換頁符
\cX 與X對應的控制字符(ctrl+X)

1.字符類

  • 匹配單個字符
    通常狀況下正則表達式一個字符對應字符串一個字符,表達式ab\t的含義是'ab' + table鍵正則表達式

  • 匹配一類字符[]
    可使用元字符[]來構建一個簡單的類。所謂就是指符合某些特性的對象,一個泛指,而不是特指某個字符。
    表達式[abc]把字符a或b或c歸爲一類,表達式能夠匹配這類的字符,便可以匹配a或b或c中的任一個。編程

'a1b2c3d4'.replace(/[abc]/g, 'X'); // 結果:'X1X2X3d4'
  • 字符類取反 數組

    使用元字符^建立 反向類/負向類。反向類的意思是不屬於某類的內容。
    表達式[^abc]表示不是字符a或b或c的內容bash

'a1b2c3d4'.replace(/[^abc]/g, 'X'); // 結果:'aXbXcXXX'

2.範圍類

使用[a-z]來鏈接兩個字符表示從a到z的任意字符,這是一個閉區間,也就是包含a和z自己。編程語言

'a1b2c3D4'.replace(/[a-zA-Z]/g, 'X'); // 結果:'X1X2X3X4'

// 匹配數字
'2017-05-01'.replace(/[0-9]/g, 'X'); // 結果:'XXXX-XX-XX'
// 匹配橫線
'2017-05-01'.replace(/[0-9-]/g, 'X'); // 結果:'XXXXXXXXXX'

3.預約義類

字符 等價類 含義
. [^\r\n] 除回車符和換行符以外的全部字符
\d [0-9] 數字字符
\D [^0-9] 非數字字符
\s [\t\n\xOB\f\r] 空白符
\S [^\t\n\xOB\f\r] 非空白符
\w [a-zA-Z_0-9] 單詞字符(字母、數字、下劃線)
\W [^a-zA-Z_0-9] 非單詞字符

匹配一個ab + 數字 + 任意字符的字符串函數

ab\d.

4.邊界

幾個常見的邊界匹配字符

字符 含義 字符 含義
^ 以xxx開始 $ 以xxx結束
\b 單詞邊界 \B 非單詞邊界

注意:^符號不在中括號[]內,則表示以xxx開始,而非取反的意思。

'@123@abc@'.replace(/@./g, 'X'); // 'X23Xbc@'

'@123@abc@'.replace(/^@./g, 'X'); // 'X23@abc@'

'@123@abc@'.replace(/.@/g, 'X'); // '@12XabX'

5.量詞

字符 含義
? 出現零次或一次(最多出現一次)
+ 出現一次或屢次(至少出現一次)
* 出現零次或屢次(任意次)
{n} 出現n次
{n, m} 出現n到m次
{n,} 至少出現n次

3、貪婪模式與非貪婪模式

1.貪婪模式

儘量多的匹配。

'123456789'.replace(/\d{3,6}/, 'X'); // X789

2.非貪婪模式

儘量少的匹配,也就是說一旦成功匹配就再也不繼續嘗試。方法:在量詞後面加上 ?便可。

'123456789'.match(/\d{3,6}?/g); // ['123', '456', '789']

4、分組、或、反向引用(分組捕獲)、忽略分組

1.分組

使用()能夠達到分組的功能,使量詞做用於分組

// 匹配字符串 'Byron' 連續出現3次的場景。
 Byron{3}  // 匹配'n'連續出現了3次的場景
(Byron){3} // 匹配'Byron'連續出現了3次的場景
// 匹配字母+數字連續出現3次的場景
'a1b2c3d4'.replace(/[a-z]\d{3}/g, 'X'); // a1b2c3d4
'a1b2c3d4'.replace(/([a-z]\d){3}/g, 'X'); // Xd4

2.或

使用 |能夠達到的效果

'ByronCasper'.replace(/Byron|Casper/g, 'X'); // XX
'ByronsperByrCasper'.replace(/Byr(on|Ca)sper/g, 'X'); // XX

3.反向引用(分組捕獲)

// 實現:2017-05-01 => 05/01/2017
'2017-05-01'.replace(/(\d{4})-(\d{2})-(\d{2})/g, '$2/$3/$1'); // 05/01/2017

4.忽略分組

不但願捕獲某些分組,只需在分組內加上?:便可。

(?:Byron).(ok)

5、前瞻、後顧(後瞻)

正則表達式從文本頭部向尾部開始解析,文本尾部方向,稱爲
前瞻就是在正則表達式匹配到規則的時候,向前檢查是否符合斷言,後顧/後瞻方向相反。

JavaScript不支持後顧。

符合與不符合特定斷言稱爲確定/正向匹配和否認/負向匹配。

名稱 正則 備註
正向前瞻 exp(?=assert)
負向前瞻 exp(?!assert)
正向後顧 exp(?<=assert) JavaScript不支持
負向後顧 exp(?<!assert) JavaScript不支持
\w(?=\d)
'a2*34v8' .repalce(/\w(?=\d)/g, 'X'); // X2*X4X8
'a2*34vv' .repalce(/\w(?!\d)/g, 'X'); // aX*3XXX

6、對象屬性

字符 含義 默認值
g global 全文搜索,不添加則搜索到第一個匹配中止 flase
i ignore case 忽略大小寫,默認大小寫敏感 flase
m multiple lines 多行搜索 flase
l lastIndex 當前表達式匹配內容的最後一個字符的下一個位置
s source 正則表達式的文本字符串
var mulStr = '
    @123
    @456
    @789
';

mulStr.replace(/^@\d/g, 'X');
// 'X23
// @456
// @789'

mulStr.replace(/^@\d/gm, 'X');
// 'X23
// X56
// X89'

7、RegExp對象方法test與exec

一、test()

test() 方法用於檢測一個字符串是否匹配某個模式。

RegExpObject.test(string);

string 必需。要檢測的字符串。

  • 返回值

若是字符串 string 中含有與 RegExpObject 匹配的文本,則返回 true,不然返回 false。

  • 說明
    調用 RegExp 對象 r 的 test() 方法,併爲它傳遞字符串 s,與這個表示式是等價的:(r.exec(s) != null)。

二、exec(str)

使用正則表達式模式對字符串執行搜索,並將更新全局RegExp對象的屬性以反映匹配結果

// exec() 方法用於檢索字符串中的正則表達式的匹配。
RegExpObject.exec(string)
  • 返回值

返回一個數組,其中存放匹配的結果。若是未找到匹配,則返回值爲 null。

  • 說明

exec() 方法的功能很是強大,它是一個通用的方法,並且使用起來也比 test() 方法以及支持正則表達式的 String 對象的方法更爲複雜。

若是 exec() 找到了匹配的文本,則返回一個結果數組。不然,返回 null。此數組的第 0 個元素是與正則表達式相匹配的文本,第 1 個元素是與 RegExpObject 的第 1 個子表達式相匹配的文本(若是有的話),第 2 個元素是與 RegExpObject 的第 2 個子表達式相匹配的文本(若是有的話),以此類推。除了數組元素和 length 屬性以外,exec() 方法還返回兩個屬性。index 屬性聲明的是匹配文本的第一個字符的位置。input 屬性則存放的是被檢索的字符串 string。咱們能夠看得出,在調用非全局的 RegExp 對象的 exec() 方法時,返回的數組與調用方法 String.match() 返回的數組是相同的。

可是,當 RegExpObject 是一個全局正則表達式時,exec() 的行爲就稍微複雜一些。它會在 RegExpObject 的 lastIndex 屬性指定的字符處開始檢索字符串 string。當 exec() 找到了與表達式相匹配的文本時,在匹配後,它將把 RegExpObject 的 lastIndex 屬性設置爲匹配文本的最後一個字符的下一個位置。這就是說,您能夠經過反覆調用 exec() 方法來遍歷字符串中的全部匹配文本。當 exec() 再也找不到匹配的文本時,它將返回 null,並把 lastIndex 屬性重置爲 0。

8、支持正則表達式的 String 對象的方法

方法 描述
search 檢索與正則表達式相匹配的值。
match 找到一個或多個正則表達式的匹配。
replace 替換與正則表達式匹配的子串。
split 把字符串分割爲字符串數組。

資源

w3school文檔: http://www.w3school.com.cn/js...

imooc視頻: http://www.imooc.com/learn/706

出處: https://github.com/capricornc...

相關文章
相關標籤/搜索