JS正則表達式詳解

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/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375