理清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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...