JavaScript-正則表達式中的修飾符和對象有哪些?

2020-12-22 尚學堂前端學院

本節主要內容:

1.什麼是正則表達式

2.正則表達式進階

3.正則表達式高級

學習目標:

一、正則表達式

1.1 正則表達式概述

按照一定的規則,查找和替換字符串。

正則表達式概念:

正則表達式(英文為regular Expression)是一種【字符串檢索模式】

正則表達式具體表現為一個字符串的樣子。

正則表達式執行原理是:

通過【參數字符串】設置檢索規則,在【指定字符串】中檢索符合規則的字符串。

正則表達式的作用是:

可以用來進行文本搜索和文本替換。

1.2 正則表達式基本語法

正則表達式的基本語法

語法:/正則表達式主體/修飾符(可選)

例如:var frk_reg = /frank/gi;

其中

(1)/frank/i是一個正則表達式

(2)frank是這個正則表達式的主體,表示想要檢索的內容是frank

(3)i 是一個正則表達式的修飾符,表示檢索內容時不區分大小寫

1.3 正則表達式常見用法

正則表達式在實際開發中一般不會單獨使用,而是會配合一些方法來完成某種功能。

因為正則表達式的作用是對字符串進行操作,所以一般在實際開發中正則表達式會配合字符串的search和replace方法來使用。

1.3.1 search方法

search方法用於檢索與正則表達式相匹配的子字符串,並返回子字符串的起始位置。找不到是-1

例如:

在指定字符串中,通過正則表達式搜索目標子字符串。並且不區分大小寫。

var str = 'Hello Frank! GoodBye Frank!';

var first_index = str.search(/frank/i);

console.log(first_index);

1.3.2 match方法

match() 方法可在字符串內檢索指定的值,或找到一個或多個正則表達式的匹配。

返回值存放匹配結果的數組

var str = 'Hello Frank! GoodBye Frank!';var first_index = str.match(/frank/gi);console.log(first_index);

1.3.3 replace方法

replace方法:用於在指定字符串中用一個字符串替換一個與正則表達式相匹配的子字符串

例如:

在指定字符串中,通過正則表達式替換指定字符串中的目標字符串

var str = 'Hello Frank! GoodBye Frank!';var newStr = str.replace(/frank/i,'frankenStein');console.log(newStr);

很顯然replace方法的作用是替換第一個匹配到的字符串,所以我們僅替換了第一個符合規則的Frank。

二、正則表達式進階

2.1 修飾符

修飾符是正則表達式進行字符串檢索時【檢索規則】的制定者之一。

修飾符規定了正則應按照何種方式進行檢索。

常見的修飾符類型有兩種:i 、g

i修飾符,表示正則檢索內容時不區分大小寫

例如:

使用i修飾符,在str中檢索frank出現的第一次下標

var str = 'Hello Frank! GoodBye Frank!'; var first_index = str.search(/frank/i);console.log(first_index);

代碼的執行結果是:6

不使用i修飾符,在str中檢索frank出現的第一次下標

var str = 'Hello Frank! GoodBye Frank!';var first_index = str.search(/frank/);console.log(first_index);

代碼的執行結果是:-1

g修飾符,表示正則檢索內容時採用全局匹配,而不是找到第一個就停止。

例如:

使用g修飾符,在str中替換所有的Frank為frankenStein

var str = 'Hello Frank! GoodBye Frank!';var newStr = str.replace(/frank/gi,'frankenStein');console.log(newStr);

代碼的執行結果是:Hello frankenStein! GoodBye frankenStein!

不使用g修飾符,在str中替換所有的Frank為frankenStein

var str = 'Hello Frank! GoodBye Frank!';var newStr = str.replace(/frank/i,'frankenStein');console.log(newStr);

代碼的執行結果是:Hello frankenStein! GoodBye Frank!

2.2 檢索模式

正則表達式的檢索模式,用於指定正則採用何種方式進行內容的檢索。

常見的檢索模式有表達式模式、元字符模式和量詞模式三種。

他們並不互相獨立而是相輔相成的關係,就像修飾符可以多個一起使用一樣。

2.2.1表達式模式

正則表達式的書寫方式是通過表達式編寫的模式稱為表達式模式。

常見的表達式模式有以下三種:

a) [abc]

b) [0-9]

c) [m|n]

每一種模式中的內容都是表示一類值,而不是字面的含義。

一個方括號代表一個字符。

[abc]:在指定字符串中檢索,查找任何滿足【存在於方括號中】規則的字符或字符串。

例如:

在str中替換所有:只要滿足【是a、b當中之一】的字符為(frank)

var str = '12abc12ABC';var newStr = str.replace(/[ab]/gi,'(frank)');console.log(newStr);//12(frank)(frank)c12(frank)(frank)C

正則不只是能替換英文,對於中文正則仍然生效

var str = '你好,弗蘭克!再見,弗蘭克!';

var newStr = str.replace(/[弗蘭克]/g,'(frank)');

console.log(newStr);//你好,(frank)(frank)(frank)!再見,(frank)(frank)(frank)!

正則匹配字符串時採用多個方括號即可

var str = '你好,弗蘭克!再見,弗蘭克!';var newStr = str.replace(/[弗][蘭][克]/g,'(frank)');console.log(newStr);//你好,(frank)!再見,(frank)!

[0-9]:在指定字符串中檢索,查找任何滿足【0至9之間】規則的的字符或字符串。該模式對字母也適用。

例如:在str中替換所有:【任意是0-9之間之一】的字符為(frank)

var str = '12abc12ABC';var newStr = str.replace(/[0-9]/gi,'(frank)');console.log(newStr);//(frank)(frank)abc(frank)(frank)ABC

在str中替換所有:【任意是a-z之間之一】的字符為(frank)

var str = '12abc12ABC';var newStr = str.replace(/[a-z]/g,'(frank)');console.log(newStr);//12(frank)(frank)(frank)12ABC

在str中替換所有:【任意是A-Z之間之一】的字符為(frank)

var str = '12abc12ABC';var newStr = str.replace(/[A-Z]/g,'(frank)');console.log(newStr);//12abc12(frank)(frank)(frank)

(x|y):在指定字符串中檢索,查找任何滿足【以|分隔的選項之一】的字符或字符串。

例如:

在str中替換所有:【ab或者是ABC字符串】為'(frank)'

var str = '12abc12abABC';var newStr = str.replace(/(ab|ABC)/g,'(frank)');console.log(newStr);//12(frank)c12(frank)(frank)

ps:需要注意的是,如果使用|進行正則查找,則使用的是小括號。而不是中括號

2.2.2元字符模式

元字符:具有特殊含義的字符稱為元字符。

通過元字符來進行正則檢索的模式,稱為元字符模式。

常見的元字符模式有以下三種:

\w\d c) \s

d) \b

一個元字符代表一個字符。

\w 元字符用於查找字母,數字,下劃線。

z、A-Z、0-9,以及下劃線。var str = '$12abc12a@@^*(*^bABC';var re = str.match(/\w/g);console.log(re);

\W:除了字母,數字,下劃線

\d:在指定字符串中檢索,查找任何【是數字】規則的字符或字符串。

例如:

var str = '12abc12abABC';var newStr = str.replace(/\d/g,'(frank)');console.log(newStr);//(frank)(frank)abc(frank)(frank)abABCvar str = '12abc12abABC';var newStr = str.replace(/\d\d/g,'(frank)');console.log(newStr);//(frank)abc(frank)abABC

\D:除了數字的

\s: 在指定字符串中檢索,查找任何【是空白】規則的字符或字符串

例如:

var str = ' 12abc 12ab ABC ';var newStr = str.replace(/\s/g,'(frank)');console.log(newStr);//(frank)12abc(frank)12ab(frank)ABC(frank)var str = ' 12abc 12ab ABC ';var newStr = str.replace(/\s\s/g,'(frank)');console.log(newStr);// 12abc 12ab ABC\S:除了空白的字符

\b: 在指定字符串中檢索,查找任何【是單詞邊界】規則的字符或字符串

也就是說匹配單詞的開頭和結尾。

1.匹配結尾是abc的替換

2.匹配開頭是abc的替換

3.\B:除了開頭是abc的單詞,查找結尾是abc的或者是中間是abc的

例如:

var str = '12abc 12ab ABC';var newStr = str.replace(/\b/g,'(frank)');console.log(newStr);//(frank)12abc(frank) (frank)12ab(frank) (frank)ABC(frank)

var str = '12abc 12abAbc';var newStr = str.replace(/\b/g,'(frank)');console.log(newStr);//(frank)12abc(frank) (frank)12abABC(frank)

2.2.3 量詞模式

量詞:表示要檢索的字符或字符串出現的次數的詞組稱為量詞。

如果用n表示要檢索的字符或字符串,

那麼常見的量詞模式有以下三種:

a) n+

b) n*

c) n?

ps:n除了是具體的字符或字符串外,還可以是表達式或者元字符

n+:在原字符串中檢索任何【包含一個或多個n】的子字符串。

例如:

var str = 'a1abb2ab3baab';var newStr = str.match(/a/g);console.log(newStr);//["a", "a", "a", "a", "a"]var str = 'a1abb2ab3baab';var newStr = str.match(/ab/g);console.log(newStr);//["ab","ab","ab"]

var str = 'a1abb2ab3baab';var newStr = str.match(/a+/g);console.log(newStr);//["a", "a", "a", "aa"]

var str = 'a1abb2ab3baab';var newStr = str.match(/ab+/g);console.log(newStr);//["abb", "ab", "ab"]

n*:在原字符串中檢索任何【包含0個或多個n】的子字符串。

例如:

var str = 'a1abb2ab3baab';var newStr = str.match(/a*/g);console.log(newStr);//["a", "", "a", "", "", "", "a", "", "", "", "aa", "", ""]var str = 'a1abb2ab3baab ';var newStr = str.match(/ab*/g);console.log(newStr);//["a", "abb", "ab", "a", "ab"]

ps:為什麼匹配單個字符的時候結果中有空字符串,而匹配多個字符構成的字符串時結果中就沒有空字符串?

n?: 在原字符串中檢索任何包含0個或1個n的子字符串

例如:

var str = 'a1abb2ab3baab';var newStr = str.match(/a?/g);console.log(newStr);//["a", "", "a", "", "", "", "a", "", "", "", "a", "a", "", ""]var str = 'a1abb2ab3baab';var newStr = str.match(/ab?/g);console.log(newStr);//["a", "ab", "ab", "a", "ab"]

2.2.4 作業:

表單的驗證

用戶名:

密碼:

郵箱:

手機號:

2.3 RegExp對象

上面我們提到過正則表達式的基本語法是:/正則表達式主體/修飾符(可選),這種創建正則的方法我們稱之為【字面量創建正則表達式】。

而實際上在js中已經為正則表達式提供了一個構造函數RegExp,我們可以通過這個構造函數來生成一個正則表達式的實例,而這種創建正則的方法我們稱之為【構造函數創建正則表達式】。

對於通過RegExp構造函數生成的正則實例來說,我們既能夠和之前使用正則表達式一樣將這個正則實例直接使用,還能夠通過這個實例來調用一些RegExp所獨有的方法

語法:

var regExp = new RegExp(正則表達式內容,修飾符);

ps:通過構造函數方式創建正則,參數均採用字符串來聲明

例如:

var regExp = new RegExp('ab','g');//【等價於正則表達式:/ab/g】var str = '12abc12abABC';var newStr = str.replace(regExp,'(frank)');console.log(newStr);//12(frank)c12(frank)ABC

2.3.1RegExp對象的test()方法

本方法是RegExp對象中提供的一個方法,用來判斷在【指定字符串中】是否存在【滿足正則表達式規則】的子字符串。存在就返回true,反之返回false。

語法:

正則表達式.test(指定字符串)

Str.match(正則表達式);

例如:

var regExp = new RegExp('abcd','g');console.log(regExp.test('12abc12abABC'));//falsevar regExp = new RegExp('abc','g');console.log(regExp.test('12abc12abABC'));//true

ps:其實RegExp中提供的方法對於正則表達式都是通用的,也就意味著下面的代碼也是合法的:

2.3.2 RegExp對象的exec()方法

本方法是RegExp對象中提供的一個方法,用來查找在【指定字符串中】【第一個】【滿足正則表達式規則】的子字符串出現的【下標和內容】。

exec() 的工作原理如下:

找到第一個子字符串,並存儲其位置如果再次運行 exec(),則從存儲的位置開始檢索,並找到下一個子字符串,並存儲其位置語法:

正則表達式.exec(指定字符串)

例如:

var regExp = new RegExp('abc','gi');var result = regExp.exec('12abc12abABC');console.log(result);//["abc", index: 2, input: "12abc12abABC"]console.log(result.length);//1result = regExp.exec('12abc12abABC');console.log(result);//["ABC", index: 9, input: "12abc12abABC"]console.log(result.length);//1result = regExp.exec('12abc12abABC');console.log(result);//null

例2:

var patt1=new RegExp("e","gi");do{var re = patt1.exec("The best things in life are free");console.log(re);}while(re!=null);

三、正則表達式高級

3.1 檢索模式的^和$字符

^初位字符:表示判斷字符串以某個內容開始(匹配開頭是什麼內容)

$末位字符:表示判斷字符串以某個內容結束(匹配結尾是什麼內容的)

var regExp = new RegExp('^abc','gi');//表示【判斷是否以abc字符串開始】的正則

var regExp = new RegExp('$abc','gi');//表示【判斷是否以abc字符串結尾】的正則

3.2 重複類

重複類其實是正則表達式中使用{}進行檢索的的一種模式的稱謂,{}用來匹配符合正則要求的字符連續出現的次數。

其常見用法是配合表達式模式進行一起使用。重複類常見寫法有一下三種:

subStr{n}:想要檢索的內容恰好出現n次

subStr{n,}:想要檢索的內容至少出現n次

subStr{n,m}:想要檢索的內容至少出現n次,至多出現m次

語法:

var regExp = new RegExp('正則表達式主體 重複類','修飾符');

var regExp = new RegExp('[a-z]{2}','g');

表示創建了一個【全局中檢索連續出現的兩個小寫字母】的正則

例如:

var regExp = new RegExp('[a-z]{2}','g'); var string = '12abcabc12abccab'; console.log(string.match(regExp));//["ab", "ca", "bc", "ab", "cc", "ab"]

3.3 貪婪模式、懶惰模式

正則表達式--貪婪模式(greed)、懶惰模式(lazy)

其實對於正則來說,貪婪與懶惰兩種模式都是被固化至表達式內的兩種隱形的檢索模式。他們並不歸屬於任何一種我們之前所說的檢索模式,而是在此之外隱形生效的。

貪婪模式(greed):

只要符合正則要求就一直向下匹配,直到無法再匹配為止的行為模式(例如n*)

懶惰模式:

一旦匹配到複合正則要求的內容就立即結束的行為模式。(例如n?)

在正則中,不同的符號能夠隱式說明當前的正則是採用貪婪模式還是懶惰模式。

常見符號有以下這些:

貪婪模式的標示符:+,*,{n},{n,},{n,m}.

懶惰模式:+?,?,*?,{n}?,{n,}?,{n,m}?;

通過一個簡單的例子我們看一下貪婪模式和懶惰模式在正則中是如何發揮作用的:

//普通正則

var str = 'a1abb2ab3baab';var newStr = str.match(/[a-z]/g);console.log(newStr);//["a", "a", "b", "b", "a", "b", "b", "a", "a", "b"]

//貪婪模式

var str = 'a1abb2ab3baab';var newStr = str.match(/[a-z]* /g);console.log(newStr);//["a", "", "abb", "", "ab", "", "baab", ""]

//懶惰模式

var str = 'a1abb2ab3baab'; var newStr = str.match(/[a-z]?/g); console.log(newStr);//["a", "", "a", "b", "b", "", "a", "b", "", "b", "a", "a", "b", ""]

效果非常明顯,邏輯也非常簡單。

所謂的貪婪模式無非就是令匹配結果儘可能的長,直到不滿足為止。

而懶惰模式則是令匹配結果儘可能的短,匹配到就結束。

3.4 脫字符[^]

脫字符是正則中^符號的一種特殊表達方式,表示【不是...】的意思。若且唯若^符號出現在中括號的首位時,我們稱^符號為脫字符。

如果不寫在中括號中表示初位字符,如果寫在中括號中卻沒寫在首位,則表示普通字符。

例如:

var regExp = new RegExp(『[^abc]』,『gi』); //表示出現不是abc中的任意一個就符合該正則 var string = '12abcabc12abccab'; var result = string.match(regExp); console.log(result);//["1", "2", "1", "2"]

var regExp = new RegExp('[^abc]{2}','gi');

//表示連續兩個出現的字符【不是abc中的任意一個】就符合該正則

var string = '12^abcabc12^abccab'; var result = string.match(regExp); console.log(result);//["12", "12"]

3.5 年齡,手機,郵箱的正則表達式

3.5 作業:多個小女孩的運動

構造函數實例化對象的時候自動調用

Es6的寫法

Es5利用構造函數創建對象

小女孩運動的原型版

小女孩運動的繼承版

3.6 作業:輪播圖

本文由尚學堂前端學院原創,歡迎關注,帶你一起學習Web前端知識!

相關焦點

  • 學習爬蟲的第49天,正則表達式被我踩在腳下
    好在有朋友在評論區告訴我:不用太在乎 bs4 了,正則表達式學好就行了,效率不是 bs4 可以比的。一下子點燃了我前進的道路、又讓我變得元氣滿滿。巧合的是,今天老師就開始講正則表達式了,這就是命中注定吧。
  • Python正則表達式由淺入深(三)
    經過前面三篇連載文章,相信大家對Python的re模塊使用正則表達式來匹配字符串已經有所了解。到目前為止,基本上有難度入門知識點都已經學完,我們繼續補充還沒講到的知識點,包括:行定位符與轉義字符,以及re模塊的re.sub()方法和re.split()方法。
  • Python正則表達式由淺入深(二)
    在前兩篇連載文章中,我們學習了re模塊的match()、search()、findall()方法,以及學習了使用正則表達式中常用的元字符、限定符、選擇字符、中括號來搭配這些方法來靈活處理常見的數據匹配問題。這本篇文章分鐘,我們將會進一步學習正則表達式中其他符合,包括令初學者非常頭疼的分組問題。
  • python正則表達式使用方法說明
    曾光紅/文 (同步發布豆瓜網)一、導入re庫python使用正則表達式要導入re庫。import re在re庫中。正則表達式通常被用來檢索查找、替換那些符合某個模式(規則)的文本。二、使用正則表達式步驟1、尋找規律;2、使用正則符號表示規律;3、提取信息,如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
  • Python正則表達式由淺入深(一)
    幸運的是Python提供了re模塊,可以實現正則表達式的操作。re模塊主要通過六大方法來對字符串進行處理,包括:match()、search()、findall()、split()、sub()。這些方法涉及到字符串的匹配與替換等操作,在接下來的4篇連載文章裡,我們不單只會講解這4種方法,還會把元字符、行定位符、限定符、字符類、排除字符、選擇字符、轉義字符、分組等正則表達式最常用知識點貫穿起來。
  • java正則表達式入坑指南
    在日常開發工作中,無論你使用的語言是java、python、shell、golang還是C#, 正則表達式是程式語言中幾乎繞不開的話題。有了它,可以幫你快速定位到符合條件的文本內容。今天小編帶大家一起來學習下正則表達式,相信通過這篇文章的介紹,能為以後的工作提供一個更清晰的思路。
  • Python中使用re模塊實現正則表達式的匹配字符串操作
    第八十二節:匹配字符串經過上一節比較枯燥的基礎內容,今天來看看如何利用正則表達式在Python中進行具體操作。在Python中使用正則表達式,首先要導入一個re模塊。在Python中,使用正則表達式匹配字符串,多數情況下,匹配成功後立即返回Match對象,不成功就返回None值。None值就是假值,這個不用多述。Match對象是什麼呢?
  • Python學習第137課——正則表達式中實現可選規則
    正則表達式英文是Regular Expression,各種程式語言中都是把它簡寫成Regex,或者Regexp或者re。這節我們學習如何在正則表達式中實現可選規則。●用小括號和pipe(豎線|)實現每一個可選項例1:現在假設我們有一個應答機器人,接到了很多很多用戶的留言,這些留言中包括用戶自己的姓名、聯繫電話等信息。
  • Python正則表達式:特殊符號和字符
    正表達式為高級的文本模式匹配,抽取,與/或文本形式的搜索和替換功能提供了基礎。簡而言之,正則表達式(簡稱regex)是由一些字符和特殊符號組成的字符串,它描述了模式的重複或者表達多個字符。python通過標準庫中的re模塊來支持正則表達式。
  • Javascript去除字符串中的點或其他符號
    今天在寫一個前端頁面的時候遇到了一個ip參數問題,我想把ip值中的點替換成 - 的形式。在前端上使用javascript進行操作的。測試了兩次沒有好用,程序直接把整個字符串都進行了替換,在考慮這個是為什麼呢?
  • 第一篇:JavaScript基本語法
    例如:document對象就是瀏覽器提供的對象,它可以讓開發人員通過JS腳本,操作 HTML 頁面中的所有元素。在上面的JS腳本代碼中,就使用了document對象,該對象在JS腳本內不需要實例化可以直接使用。
  • PHP正則表達式及表單註冊案例
    正則表達式是一種具有特定模式的用來匹配文本的字符串
  • 「Java」基礎19:修飾符有哪些?
    3.修飾成員變量成員變量和局部變量有一個區別在於:成員變量是有默認值的。所以用final修飾成員變量,它就不再有默認值了,必須一步直接賦值 。二、權限修飾符public這個關鍵字太常見了,它就是一個權限修飾符。在Java語言裡面有四種權限修飾符。其實看字面意思也蠻好理解的:①public:公共的。
  • 怎樣用正則表達式判斷輸入框中是否是車牌號
    我們在製作網頁時,會經常性的遇到判斷輸入框的輸入內容的問題,有時我們會單純的判斷長度,有時既要判斷輸入字符的長度,又要判斷其是否符合規定,下面小漁來教大家一個簡便的方法判斷輸入框中是否為車牌號【新建一個html文件】首先我們需要新建一個html文件,html頁面中主要列出兩個input,一個div,並為其添加相應的樣式即可
  • Python中使用re模塊實現正則表達式的分割字符串操作
    第八十四節:正則表達式實現分割字符串操作分割字符串的方法在前面就學習過,用正則表達式實現分割字符串,使用的依然是split()方法,分割後也是返回一個列表,不同點在哪裡呢?>str.split(sep,maxsplit)再來看使用正則表達式
  • Python中使用re模塊實現正則表達式的替換字符串操作
    >和昨天學過的三種匹配字符串的方法一樣,模塊名re使用一個點「.」和方法名sub連接;方法名sub後的小括號可以設置五個參數,前三個必備,後兩個可選,中間使用逗號「,」分隔;第一個參數是老熟人pattern,代表正則表達式轉換的模式字符串;
  • 正則表達式斷言精講Java語法實現
    斷言本文目的是講解正則表達式之斷言用法。目前網際網路上有很多博文對斷言講解的並不透徹,如果您剛開始學習斷言,相信此博文會對您有幫助。1.2.3.1 情景導入假設,我要獲得一個字符串裡面所有以空格開頭的英文詞語。
  • JavaScript-window對象常用屬性及方法有哪些?
    BOM:Browser Object Model 是瀏覽器對象模型,BOM由多個對象構成,其中代表瀏覽器窗口的window對象是BOM的頂層對象也是核心對象,其他對象都是該對象的子對象。1.2 BOM包含哪些內容?
  • 什麼是JavaScript對象?如何創建並引用?這就告訴你!
    js 中我們包含哪些對象呢?內置對象(本地對象):Math對象,Number對象,Date對象等,系統給我們提供好的,我們拿過來用就可以了。宿主對象:dom(文檔對象模型),bom(瀏覽器對象)。>var obj2 = new Object();var obj3 = Object.create(null);Object是在javascript中一個被我們經常使用的類型,而且JS中的所有對象都是繼承自Object對象的三、對象的鍵名和鍵值
  • 說說那些經典的web前端面試題-JavaScript部分
    indexOf() – 返回字符串中一個子串第一處出現的索引。如果沒有匹配項,返回 -1 。charAt() – 返回指定位置的字符。lastIndexOf() – 返回字符串中一個子串最後一處出現的索引,如果沒有匹配項,返回 -1 。match() – 檢查一個字符串是否匹配一個正則表達式。