理清JavaScript正則表達式--上篇

来源:http://www.cnblogs.com/giggle/archive/2016/05/27/5532453.html
-Advertisement-
Play Games

在JavaScript中,正則表達式由RegExp對象表示。RegExp對象呢,又可以通過直接量和構造函數RegExp兩種方式創建,分別如下: 其中,末尾的可選字元(g、i和m)分別表示: g: 模式執行一個全局匹配。簡而言之,就是找到所有匹配,而不是在找到第一個之後就停止。 i: 模式執行不區分大 ...


在JavaScript中,正則表達式由RegExp對象表示。RegExp對象呢,又可以通過直接量和構造函數RegExp兩種方式創建,分別如下:

//直接量
var re = /pattern/[g | i | m];
//構造函數
var re = new RegExp(["pattern", ["g" | "i" | "m"]]);

其中,末尾的可選字元(g、i和m)分別表示:

  g模式執行一個全局匹配。簡而言之,就是找到所有匹配,而不是在找到第一個之後就停止。

  i模式執行不區分大小寫的匹配。

  m: 多行模式,^和$錨除了匹配字元串的開頭和結尾外,還匹配每行的開頭和結尾。例如,模式/Java$/m匹配"Java"和"Java\nScript"。

基礎篇

--特殊字元--

在正則表達式中,所有的字母字元和數字都可以按照直接量與自身匹配,如/JavaScript/匹配的就是字元串"JavaScript",但是有些特殊字元呢?如換行符。所以在JavaScript中規定以反斜杠(\)開頭的轉義序列支持這些特殊字元。常用的特殊字元如下:

轉義字元

匹配

\n

換行符

\r

回車

\f

換頁符

\t

製表符

\v

垂直製表符

 --字元類--

在正則表達式中,倘若將單獨的字元放入方括弧([ ])中,就可以組合成字元類。應用到匹配字元串中,我們可以將其看成一個漏斗,當字元串中的每個字元通過它時,都查找是否在這個類裡面,如若在,就匹配成功,否則out。如下:

/*
    match為字元串的方法,它的唯一參數就是一個正則表達式,
    如果該正則表達式設置了標誌g,該方法返回的數組包含的就是出現在字元串中的所有匹配。
    詳細的用法將在下麵“正則表達式在String中的應用”細講
*/
"abc".match(/[abc]/g);

匹配結果為:

如果我們的意願是,想匹配除字元a、b、c之外的字元呢?我們可以定義一個否定類,只需將^符號放入[ ]中作為開頭就OK啦。如下:

"abc".match(/[^abc]/g);

由於某些字元類經常用到,固JavaScript的正則表達式就用反斜杠(\)與一些特殊字元組合起來表示這些常用類,而不必再需要我們自行添加,如\d。

常用正則字元類如下:

字元類

匹配

例子

[ …]

位於方括弧之中的任意字元

/M[onke]y/ 匹配 "Moy"

[ ^…]

除包含在方括弧之中的任意字元

/M[^onke]y/ 匹配 "May"

.

除換行符之外的任意字元

/../ 匹配 "Mo"

\w

字母、數字或下劃線

/1\w/ 匹配 "1A"

\W

除字母、數字和下劃線之外的字元

/1\W/ 匹配 "1%"

\s

單個空白字元

/M\sK/ 匹配 "M K"

\S

單個非空白字元

/M\SK/ 匹配 "M_K"

\d

0到9的數字

/\d/ 匹配 "1"

\D

非數字

/\D/ 匹配 "M"

--重覆匹配--

當我們需要匹配三位數字時,我們可以這樣:/\d\d\d/,但是當我們需要匹配10位或者更多時呢?考慮到這一點,正則表達式為我們提供了重覆字元{ n, m },表示匹配前一項至少n次,但是不能超過m次。例如,剛纔我們所說的匹配三位數字時,我們可以利用重覆字元這樣啦:/\d{3}/。

由於某些重覆類型經常用到,so,正則規定一些特殊字元表示這些重覆類型。

正則重覆字元,詳情見下:

字元

含義

例子

 {n, m}

匹配前一項至少n次,但不能超過m次

/\d{2,3}/ 匹配"12"

{n, }

匹配前一項至少n次,或者更多

/\d{2, }/ 匹配"123"

{n}

匹配前一項恰好n次

/\d{2}/ 匹配"12"

匹配前一項0次或者1次,等價於{0,1}

/\d?/ 匹配"2"

+

匹配前一項1次或者多次,等價於{1, }

/\d+/ 匹配"12"

*

匹配前一項0次或者多次,等價於{0, }

/\d*/ 匹配"12"

另,以上重覆字元重覆規則為:儘可能多的匹配,即俗稱的“貪婪匹配”,如:"aaaa".match(/a+/);匹配的就是整個字元串"aaaa",而不是匹配到第一個字元a時,就放棄匹配。

那麼,有所謂的"貪婪匹配",就有"非貪婪匹配",它的規則嘛,肯定與"貪婪匹配"相反咯,即:儘可能少的匹配。

那麼,怎麼才能觸發非貪婪模式呢?

只需要在重覆字元後加入?,就ok啦,如({1, 4}?、+?等),如"aaaa".match(/a+?/);就只會匹配首個字元a咯。

註意,是儘可能少的匹配,而不是少的匹配哦。

神馬意思?如下:

"aaab".match(/a*b/);
"aaab".match(/a*?b/);

!匹配結果都是"aaab"!

有沒有點詫異,為什麼"aaab".match(/a*?b/);的匹配結果會是"aaab",而不是"ab"呢?

那是因為正則匹配都是從左往右的,就"aaab".match(/a*?b/);而言,當遇到首字元a時,它會繼續往下匹配,直到能符合匹配模式/a*?b/為止,這就是為什麼說是儘可能少的匹配,前提是滿足匹配規則

如"abbb".match(/ab*?/)的匹配結果就是"a"啦。

--字元 |( )(?: …)--

1.1、字元" | " 用於分隔,表示或。

什麼意思?

舉個慄子,如/ab | cd | ef/就可以匹配字元串"ab"或者"cd"或者"ef"。

是不是和字元類[ ]很像啊?

是的,如/a | b | c/和/[abc]/匹配效果是一樣的哦。

But字元類[ ]僅針對單個字元而言,而分隔字元" | "涉及更廣,可以針對多個字元而言,如上述所說的/ab | cd | ef/,字元類就不行咯。

你可能會說,如果我想對利用" | "組裝的類進行多次匹配呢?

加個括弧就是啦。如:

/(ab | cd |ef)+/

好滴,說到括弧,我們再來看看它的作用。非常強大哦。

1.2、括弧"( )"

括弧的作用如下:

  1、我們可以將一個單獨的項目組合成一個子表達式,以便我們可以用|、*等來處理它。如,上訴所示的/(ab | cd | ef)+/

  2、利用括弧括起來的部分,我們可以在正則表達式的後面引用前面用括弧括起來的子表達式的匹配結果,註意是結果,而不是括起來的正則表達式。

針對第二點,有什麼用呢?如我們有個需求,我想匹配在單引號或者雙引號中的數字(’12345’)時,我們就可輕而易舉利用這第二點,寫好正則表達式,如下:

/(['"])\d*\1/

測試結果如下:

好了,就第二點作用而言,結合上述demo,我們再來看看它的具體引用法則吧:

----以反斜杠\加數字的方式,引用前面帶括弧的子表達式,而這個數字呢指的就是第幾個子表達式,計算規則為從左往右,計算遇到的左括弧" ( ",到想引用的地方位置為止,無論在括弧中還嵌套不嵌套括弧。

測試Demo如下:

咦,倘若我只想讓括弧的作用為分組,而不想在後面計入引用呢?畢竟括弧多了,不好計算呢。

那麼,我們就來看看字元(?: …)咯。

1.3、(?: …)

(?: …)的作用就是,規定括弧只用於分組,而不計入後面的引用,不好理解,看個demo就明白啦。如下:

/(Java(?:Script))(nice)/

如果我想在末尾引用子表達式nice,那麼是\2,而不是\3咯,因為用(?: …)來分組滴,只管分組,而不引用,切記切記。

對(?: …)的測試demo如下:

 

--匹配位置--

在前面我們提到,創建正則對象時,可選字元m表示:多行模式,^和$錨除了匹配字元串的開頭和結尾外,還匹配每行的開頭和結尾。

那麼這個^和$就是正則為我們提供的匹配位置,即所謂的

例如:

將/JavaScript/變為/^JavaScript/,就只匹配字元串中開頭為JavaScript的啦,如匹配"JavaScriptxxx"中的JavaScript,而不匹配"xxxJavaScript"中的JavaScript。

正則表達式中的錨字元詳情見下:

字元

含義

^

匹配字元串的開頭

$

匹配字元串的結尾

\b

匹配一個詞語的邊界,指[a-zA-Z_0-9]之外的字元

\B

匹配非詞語邊界位置

(? = p)

正前向聲明,exp1(?=exp2),匹配後面是exp2的exp1

(? ! p)

反前向聲明,exp1(?!exp2),匹配後面不是exp2的exp1

^和$好理解,但是\b、(?=)、(?!)可能比較陌生,結合上表,我們再來看看下麵的demo就好啦。

對於\b的Demo如下:

 

對於(? = p)的Demo如下:

 

對於(? ! p)的Demo如下:

哎,本想一氣呵成,沒想到寫完基礎篇發現已經這麼晚了。。。有時間再梳理下正則表達式在JavaScript中的應用吧。

晚安,everyone~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • PHP 算術運算符 以下實例演示了使用不同算術運算符得到的不同結果: 運行 相關閱讀: php strstr 判斷一個字元串是否存在於里一個字元串中 php stristr() 函數查找字元串在另一字元串中的第一次出現 php strchr() 函數查找字元串在另一字元串中的第一次出現 php 兩個 ...
  • 簡介 springMVC是表現層,service充當業務層,mybatis作為持久層,通過spring將這三層整合起來。如下圖: 第一步:整合dao層 mybatis和spring整合,通過spring管理mapper介面。使用mapper的掃描器自動掃描mapper介面在spring中進行註冊。 ...
  • 獲取【下載地址】 【免費支持更新】三大資料庫 mysql oracle sqlsever 更專業、更強悍、適合不同用戶群體【新錄針對本系統的視頻教程,手把手教開發一個模塊,快速掌握本系統】 A集成代碼生成器 [正反雙向(單表、主表、明細表、樹形表,開發利器)+快速構建表單;freemaker模版技術 ...
  • 一、工廠模式 (1)簡單工廠模式: 創建一個產品介面,有一個賣產品的方法。 產品A實現產品介面,賣漢堡。 產品B實現產品介面,賣薯條。 創造者是簡單工廠模式的核心:返回值類型是IProduct介面,通過測試類傳來的形參確定返回哪個對象。 測試類:輸出薯條。 (2)方法工廠模式: (圖片來自於網路) ...
  • 在做校園網視頻網站的時候,首頁有一個導航頁面要實現滾動效果,有樣例,但代碼是在難弄懂,貌似網頁設計這塊還是只有自己的代碼自己懂,索性就仿造別人的效果自己做了一個,大體上還行,看起來還是比較流暢的,不次於原作的么。 現在先把代碼拷貝到這裡,以後再逐一簡化修改: 實現混動效果,腳本代碼如下: var a ...
  • 一:跑通ui-router. ui-router源碼在最後面 跑通後的樣子: 這個不解釋了,都是很基本的東西. 二:切換視圖: 這裡的name可以不寫,但是你得放到state的第一個參數里. 跑起來後的後果: 三:如何通過鏈接切換視圖. 1 <!DOCTYPE html> 2 <html> 3 <h ...
  • 如果你是一名前端開發工程師,一般px和em使用頻率比較高。但是今天本文的重點是介紹一些我們使用很少、甚至麽有聽說的單位。 一、重溫em 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <style type="text/css"> body {font-size: 12px; ...
  • 由於游戲類官網在頁面背景和裝飾人物的設計上追求畫麗且與游戲風格想匹配,這就給前端頁面製作人員帶來了很多的麻煩,一個頁面的製作主要時間和精力花費在相容ie6上,而ie6因為不相容png-24的圖片一直被開發人員所鄙視。 由於市場決定了頁面的存在的價值,所以ie6還是必須要相容。 下麵介紹幾種常用的解決 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...