JavaScript中的正則表達式

来源:http://www.cnblogs.com/cme-kai/archive/2016/10/12/5942633.html
-Advertisement-
Play Games

首先正則表達式是什麼? 正則表達式是一個自定義規則的表達式,用來匹配符合定義的規則的字元串。什麼意思?比如這是一個正則表達式:/\d/,\d的意思就是任意一個數字,所以這個正則表達式的意思就是匹配一個任意數字。大概明白了吧! ...


首先正則表達式是什麼?

正則表達式是一個自定義規則的表達式,用來匹配符合定義的規則的字元串。什麼意思?比如這是一個正則表達式:/\d/,\d的意思就是任意一個數字,所以這個正則表達式的意思就是匹配一個任意數字。大概明白了吧!

下麵我們來看看正則表達式都由些什麼東西組成。

一、直接量字元

字元 含義
字母和數字字元 自身
\t 匹配一個水平製表符
\v 匹配一個垂直製表符
\n 匹配一個換行符
\f 匹配一個換頁符
\r 匹配一個回車符

 

 

 

 

 

 

 

 

 

 

二、範圍類

字元 含義
- 例如a-z表示a-z的26個字母
{n,m} 匹配前一項n到m次
{n,} 匹配前一項n次或者更多次
{n} 匹配前一項n次
* 匹配前一項任意次
+ 匹配前一項至少一次
? 匹配前一項0次或1次

 

 

 

 

 

 

 

 

 

 

 

 

 

什麼意思?舉個慄子:/[a-z]3{1,3}5+/這個表達式,意思是,任意一個英文字母出現一次,然後出現一到三次數字3,然後數字5至少出現一次。

下麵我們在chrome調試工具中用test()方法試一下:

註:test()方法用來檢驗一個字元串是否匹配某個正則表達式,接收一個參數,即目標字元串,如匹配則返回true,否則返回false

三、字元類

字元 含義
[...] 匹配方括弧內任意字元
[^...] 匹配除方括弧內字元的其他任意字元
. 除換行符和行終止符之外的任意字元
\w 任意單詞和下劃線,等價於[a-zA-Z0-9_]
\W \w的否定,等價於[^a-zA-Z0-9_]
\s 匹配任意一個空白符
\S 匹配任意一個非空白符
\d 任意一個數字,等價於[0-9]
\D 任意一個非數字,等價於[^0-9]
[\b] 退格直接量

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

什麼東西,寶寶看不懂啊!讓我們看個例子:/[abc]\w\d{2}/,這個表達式的意思是,匹配abc中任意一個,接下來是一個單詞([a-zA-Z0-9])或者下劃線,然後是兩個數字。看圖!

四、錨字元

字元 含義
^ 表示以……開頭,如^a表示字元串的開頭是a字母
$ 表示以……結尾,如b$表示字元串的結尾是b字母
\b 單詞邊界,如/\bis\b/匹配is而不匹配this
\B 非單詞邊界,如/\Bis\b/可匹配this

 

 

 

 

 

 

 

 

 

這裡說一下^,表示以……開頭,我們看個例子:

作為對比,這裡表達式中沒有^

$原理跟^一樣,這裡不再贅述,只是需要註意一點,$需要寫在表達式的最後面。

 

五、修飾符

字元 含義
g 全局匹配,即找到所有匹配,而不是找到第一個就停止
i 不區分大小寫
m 多行匹配

 

 

 

 

 

 

 

在沒有g修飾符的情況下,正則表達式匹配到第一項即停止匹配,當有g修飾符時,會找到所有匹配項。我們學習一個正則表達式的新方法replace():

註:replace()方法作用是替換字元串中規定的字元,接收兩個參數,第一個參數是一個正則表達式,表示你要替換的內容,第二個參數是一個字元串,表示你要 替換成 的內容。看下麵例子!

只替換了第一個數字,再看下有g修飾符的情況:

全部數字都被替換了,明白g是幹嘛的了吧。

 

再說i,i修飾符就很簡單了,表示不區分大小寫,看下麵例子:

加了i之後,不管大小寫字母都被替換了!

 

最後m表示多行搜索,比如要匹配以字母a開頭的字元串,在有m修飾符的情況下,換行後以a開頭的行也會被匹配。限於篇幅這裡不貼圖了。

 

六、分組

正則表達式中用圓括弧()表示分組,每個()表示一個分組。而分組中的內容用$1、$2……表示,仍然看例子:

比如日期有這兩種表示法:月-日-年和年/月/日,怎麼把月-日-年換成年/月/日呢?我們看看

在這個例子中,我們給月、日和年分了組,然後再利用$反向引用,於是實現了日期格式的轉換。

 

七、方法

關於正則表達式的零零碎碎的東西基本講完了,下麵我們開始學習在正則表達式中用到的方法!有兩類,一類是正則表達式對象方法,一類是字元串對象方法。

一、正則表達式對象方法

有兩個,test()和exec()。test()方法我們學過了,現在講講exec()方法。

exec()方法返回一個數組,數組的第一個元素是匹配的文本,第二個元素是匹配文本的第一個子文本,第三個元素是匹配文本的第二個子文本……以此類推。這樣很抽象,看下麵例子就懂了!

exec()的調用又分兩種情況:非全局調用和全局調用。

非全局調用情況:

看下圖例子

 

這裡我們看到,第一次匹配了"a12b",後面兩個元素分別是第一個分組"1"和第二個分組"2"。可是第二次執行exec()方法,匹配的依然是"a12b",這是意料之外的。按理說第二次匹配的應該是"c56d",可是為什麼還是"a12b"呢?原因就在lastIndex屬性上。lastIndex屬性表示上次匹配結果的最後一個字元的下一個字元,但是這屬性只在全局調用時(即表達式中加了g修飾符的情況)生效,非全局調用時始終為0。作為對比,我們看看全局調用情況!

全局調用情況:

可以看到,第一次執行exec()返回了"a12b",lastIndex為4,即為字元串str中數字3的位置;第二次返回了"c56d",lastIndex為10,即為字元串str中數字7的位置。這時lastIndex起作用了,所以兩次執行結果都在意料之中。

二、字元串對象方法

字元串對象方法有:search()、replace()、match()、split()。

一、search()方法

search()方法用於檢索字元串中指定的子字元串,或檢索與正則表達式相匹配的子字元串。如果匹配到,則返回第一個匹配結果的index,沒匹配到則返回-1。接收一個參數,這個參數可以是字元串,也可以是正則表達式。這個方法每次都從字元串的開頭開始匹配。我們看下麵例子:

兩次搜索數字2返回的index都是1,而不會是第二個數字2的index5。第三和第四次搜索傳入一個正則表達式,都返回了相對應的index。

二、replace()方法

這個方法前面已經學過,這裡繼續。有這幾種形式:replace(str,replaceStr)、replace(RegExp,replaceStr)、replace(RegExp,function)。前面兩種比較簡單,看個例子就懂了:

第一次傳入字元串,把數字2替換成X,第二次傳入正則表達式,把全部數字替換成X。

replace(RegExp,function)方法第二個參數是一個函數,這個方法適用於比較複雜的字元替換,大家有興趣可以自己找學習資源,這裡不作介紹。

三、match()方法

match()方法傳入一個參數:正則表達式,用來查找字元串中與傳入的正則表達式相匹配的文本,如找不到則返回null,如果找到,返回一個數組,這個數組在非全局調用和全局調用時是不一樣的,下麵分開說。

非全局調用:

在非全局調用時,返回的數組是這樣的:第一個元素是匹配的文本,第二個元素是匹配文本的第一個子文本,第三個元素是匹配文本的第二個子文本……以此類推。是不是有似曾相識的感覺?沒錯,這一點和exec()方法一模一樣。

非全局調用時每次查找依然從字元串的開頭開始,下麵看看全局調用!

全局調用:

在全局調用(即正則表達式中有g修飾符)時,返回的數組是這樣的:數組的每一項都是匹配的文本,不再有匹配文本的子文本了。

和正則表達式相匹配的"a12b"和"c56d"都出現在數組裡了。其實match()方法和exec()方法作用都是一樣的,只不過一個由字元串調用,一個由正則表達式調用而已。

四、split()方法

split()方法用於把字元串分割成數組,什麼意思呢?看下麵例子:

split()方法接收的參數可以是字元串,也可以是正則表達式。從例子可以看到,參數傳什麼,就在字元串中去掉什麼,然後分割成數組。

正則表達式在字元串處理中用的非常頻繁,希望大家都能學會併在開發中自如運用,今天就講到這裡,歡迎交流,歡迎指正!

原創文章,轉載請註明出處!


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

-Advertisement-
Play Games
更多相關文章
  • 本人是軟體開發的初學者,總結了一點點日常所學,記錄在此,主要目的是鼓勵自己堅持學習,怕有一天忘記了,還能複習曾經學過的知識點。 如有大神路過為我指點迷津,糾正改錯更是感激不盡,但請不要噴我這個菜鳥!謝謝 jQuery Mobile的基本使用方法和簡單的知識點 安裝: <link rel="style ...
  • 網上有很多這方面的教程,但不是苦澀難懂就是從哪copy過來的,反正很長一段時間我是沒看懂,時間長了也沒打算去研究了,主要原因是,基本上很少會遇到那些問題(所以說啊,要是沒有研究精神的才懶得管它)。但自從開始研究CSS以後就一發不可收拾,所以打算把CSS一系列的東西都給研究一遍,當然能研究懂自然是好的 ...
  • js中的不同的數據類型之間的比較轉換規則如下: 1. 對象和布爾值比較 對象和布爾值進行比較時,對象先轉換為字元串,然後再轉換為數字,布爾值直接轉換為數字 2. 對象和字元串比較 對象和字元串進行比較時,對象轉換為字元串,然後兩者進行比較。 3. 對象和數字比較 對象和數字進行比較時,對象先轉換為字 ...
  • 為什麼計算寬度計算網頁像素寬度是為了CSS網頁佈局整齊與相容。常見的我們佈局左右結構網頁或使用padding、margin佈局的時候將計算整頁寬度,如果不計算無論是寬度過大過小就會出現錯位問題。 怎麼計算CSS寬度例一:我們計算一個左右結構的佈局樣式。假如總寬度為400px,那麼左右加起來就應當小於 ...
  • jquery實現圖片切換: javascript實現圖片切換: ...
  • window.onload用法詳解:網頁中的javaScript腳本代碼往往需要在文檔載入完成後才能夠去執行,否則可能導致無法獲取對象的情況,為了避免這種情況的發生,可以使用以下兩種方式:一.將腳本代碼放在網頁的底端,這樣在運行腳本代碼的時候,可以確保要操作的對象已經載入完成。二.通過window. ...
  • (-1)寫在前面 我用的是chrome49,這個idea是我在stackoverflow上回答問題時看到了,多謝這位同行,加深了我對很多技術點的理解,最近剛到北京,忙碌了一兩天,在後續的日子里,會被安排面試,學習計劃只能按工作流走了,做完這個要看一個特別酷的效果,好激動! (0)效果演示 (1)實現 ...
  • https://yunpan.cn/cvxaNNCE4xK7T (提取碼:639e) ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...