主頁 > 軟體設計 > JavaScript進階教程(7)-正則運算式

JavaScript進階教程(7)-正則運算式

2020-10-26 19:15:33 軟體設計

引言

正則運算式在各種編程語言中,都有廣泛的應用,在JavaScript中更是不可或缺,正則運算式通常被用來檢索、替換那些符合某個模式(規則)的文本,例如驗證表單:用戶名表單只能輸入英文字母、數字或者下劃線, 昵稱輸入框中可以輸入中文,此外,正則運算式還常用于過濾掉頁面內容中的一些敏感詞(替換),或從字串中獲取我們想要的特定部分(提取)等 , 本文從正則運算式的基本概念入手,講解了正則運算式的特點和組成,并且詳細講解了正則運算式在JavaScript中的使用,并給出了一些在實際開發中經常用到的實體,

目錄

引言

1 正則運算式

1.1 什么是正則運算式

1.2 正則運算式的作用

1.3 正則運算式的特點

1.4 正則運算式的組成

1.5 元字串

1.5.1 常用元字串

1.5.2 限定符

1.5.3 其它

2 常用正則運算式

3 在JavaScript 中使用正則運算式

3.1 創建正則運算式物件

3.1.1 方式1

3.1.2 方式2:

3.2 引數

3.3 正則運算式匹配

3.4 實體

3.4.1 驗證密碼強弱

3.4.2 驗證郵箱

3.4.3 驗證中文名字

3.5 正則運算式提取

3.6 正則運算式替換

4 案例

4.1 表單驗證案例

4.2 過濾敏感詞匯案例

?

5 總結


1 正則運算式

1.1 什么是正則運算式

正則運算式是用于匹配規律規則的運算式,它的“鼻祖”可一直追溯到科學家對人類神經系統的作業原理的早期研究,現在在各種編程語言中,正則運算式都有廣泛的應用,在JavaScript中,正則運算式也是物件,正則表通常被用來檢索、替換那些符合某個模式(規則)的文本,
正則運算式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字串”,這個“規則字串”用來表達對字串的一種過濾邏輯,

1.2 正則運算式的作用

  1. 給定的字串是否符合正則運算式的過濾邏輯(匹配),
  2. 可以通過正則運算式,從字串中獲取我們想要的特定部分(提取),
  3. 強大的字串替換能力(替換),

1.3 正則運算式的特點

  1. 靈活性、邏輯性和功能性非常的強
  2. 可以迅速地用極簡單的方式達到字串的復雜控制
  3. 對于剛接觸的人來說,比較晦澀難懂

1.4 正則運算式的組成

  • 普通字符
  • 特殊字符(元字符):正則運算式中有特殊意義的字符

示例演示:

  • \d 匹配數字
  • ab\d 匹配 ab1、ab2

1.5 元字串

1.5.1 常用元字串

元字符說明
\d匹配數字
\D匹配任意非數字的字符
\w匹配字母或數字或下劃線
\W匹配任意不是字母,數字,下劃線
\s匹配任意的空白符
\S匹配任意不是空白符的字符
.匹配除換行符以外的任意單個字符
^表示匹配行首的文本(以誰開始)
$表示匹配行尾的文本(以誰結束)

1.5.2 限定符

限定符說明
*重復零次或更多次
+重復一次或更多次
?重復零次或一次
{n}重復n次
{n,}重復n次或更多次
{n,m}重復n到m次

1.5.3 其它

1.[] 字串用中括號括起來,表示匹配其中的任一字符,相當于或的意思,
2.[^] 匹配中括號以外的內容,相當于非的意思,
3.\ 轉義符,
4.| 或者,選擇兩者中的一個,注意|將左右兩邊分為兩部分,而不管左右兩邊有多長多亂,
5.() 從兩個直接量中選擇一個,分組, eg:gr(a|e)y匹配gray和grey,
6.[\u4e00-\u9fa5] 匹配漢字,

2 常用正則運算式

驗證手機號:

^\d{11}$

驗證郵編:

^\d{6}$

驗證日期 2012-5-01:

^\d{4}-\d{1,2}-\d{1,2}$

驗證郵箱 xxx@qq.cn:

^\w+@\w+\.\w+$

驗證IP地址 192.168.1.10

^\d{1,3}\(.\d{1,3}){3}$

3 在JavaScript 中使用正則運算式

3.1 創建正則運算式物件

在 JavaScript 中,有兩種方式創建正則運算式物件,

3.1.1 方式1

var reg = new Regex('\d', 'i');
var reg = new Regex('\d', 'gi');

3.1.2 方式2

var reg = /\d/i;
var reg = /\d/gi;

3.2 引數

標志說明
i忽略大小寫
g全域匹配
gi全域匹配+忽略大小寫

3.3 正則運算式匹配

匹配日期:

//  匹配日期var dateStr = '2020-10-24';
var reg = /^\d{4}-\d{1,2}-\d{1,2}$/console.log(reg.test(dateStr)); // true

3.4 實體

3.4.1 驗證密碼強弱

<!DOCTYPE html>
<html lang="en">
        <head>
                <meta charset="UTF-8">
                <title>密碼強弱:公眾號AlbertYang</title>
        </head>
        <style type="text/css">
                #dv {
                        width: 300px;
                        height: 200px;
                        position: absolute;
                        left: 300px;
                        top: 100px;
                }

                .strengthLv0 {
                        height: 6px;
                        width: 40px;
                        border: 1px solid #ccc;
                        padding: 2px;
                }

                .strengthLv1 {
                        background: red;
                        height: 6px;
                        width: 40px;
                        border: 1px solid #ccc;
                        padding: 2px;
                }

                .strengthLv2 {
                        background: orange;
                        height: 6px;
                        width: 80px;
                        border: 1px solid #ccc;
                        padding: 2px;
                }

                .strengthLv3 {
                        background: green;
                        height: 6px;
                        width: 120px;
                        border: 1px solid #ccc;
                        padding: 2px;
                }
        </style>
        <body>
                <div id="dv">
                        <label for="pwd">密碼</label>
                        <input type="text" id="pwd" maxlength="16">
                        <div>
                                <em>密碼強度:</em>
                                <span id="strength"></span>
                                <div id="strengthLevel" class="strengthLv0"></div>
                        </div>
                </div>
                <script>
                        // 獲取文本框注冊鍵盤抬起事件
                        document.getElementById("pwd").onkeyup = function() {
                                // 每次鍵盤抬起都要獲取文本框中的內容,驗證文本框中有什么東西,得到一個級別,然后下面的div顯示對應的顏色
                                // 如果密碼的長度是小于6的,不判斷
                                let level = getLvl(this.value),
                                        levelStr = "弱";
                                if (level === 2) {
                                        levelStr = "中等";
                                } else if (level === 3) {
                                        levelStr = "強";
                                }

                                if (this.value.length >= 6) {
                                        document.getElementById("strengthLevel").className = "strengthLv" + level;
                                        document.getElementById("strength").innerHTML = levelStr;
                                } else {
                                        document.getElementById("strengthLevel").className = "strengthLv0";
                                        document.getElementById("strength").innerHTML = "";
                                }

                        };

                        // 根據密碼回傳對應的級別
                        function getLvl(pwd) {
                                let lvl = 0; // 默認是0級
                                // 判斷密碼中是否有數字
                                if (/[0-9]/.test(pwd)) {
                                        lvl++;
                                }
                                // 判斷密碼中有沒有字母
                                if (/[a-zA-Z]/.test(pwd)) {
                                        lvl++;
                                }
                                // 判斷密碼中是否有特殊符號
                                if (/[^0-9a-zA-Z_]/.test(pwd)) {
                                        lvl++;
                                }
                                return lvl; // 最小值是1,最大值是3
                        }
                </script>
        </body>
</html>

3.4.2 驗證郵箱

<!DOCTYPE html>
<html lang="en">
        <head>
                <meta charset="UTF-8">
                <title>驗證郵箱:微信公眾號:AlbertYang</title>
        </head>
        <body>
                請您輸入郵箱地址:<input type="text" value="" id="email" /> *<br />
                <script>
                        //如果輸入的是郵箱,那么背景顏色為綠色,否則為紅色
                        //獲取文本框,注冊失去焦點的事件
                        document.getElementById("email").onblur = function() {
                                //判斷這個文本框中輸入的是不是郵箱
                                let reg = /^[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_-]+([.][a-zA-Z]+){1,2}$/;
                                if (reg.test(this.value)) {
                                        this.style.backgroundColor = "green";
                                } else {
                                        this.style.backgroundColor = "red";
                                }
                        };
                </script>

        </body>
</html>

3.4.3 驗證中文名字

<!DOCTYPE html>
<html lang="en">
        <head>
                <meta charset="UTF-8">
                <title>驗證中文名字:微信公眾號AlbertYang</title>

        </head>
        <body>
                請輸入您的名字:<input type="text" value="" id="userName" />*<br />
                <script>
                        // 是中文名字,則綠色,否則紅色
                        document.getElementById("userName").onblur = function() {
                                var reg = /^[\u4e00-\u9fa5]{2,6}$/;
                                if (reg.test(this.value)) {
                                        this.style.backgroundColor = "green";
                                } else {
                                        this.style.backgroundColor = "pink";
                                }
                        };
                </script>

        </body>
</html>

3.5 正則運算式提取

// 提取年齡var str = "張三18,李四36,王五60";
var array = str.match(/\d+/g);
console.log(array);

// 提取email地址var str = "4645354@qq.com,fangfang@usa.cn 256469312@qq.com,28265432@qq.com";
var array = str.match(/\w+@\w+\.\w+(\.\w+)?/g);
console.log(array);

// 分組提取  
// 提取日期中的年  2020-10-24var dateStr = '2020-10-24';
// 正則運算式中的()作為分組來使用,獲取分組匹配到的結果使用Regex.$1 $2 $3...
var reg = /(\d{4})-\d{1,2}-\d{1,2}/;
if (reg.test(dateStr)) {
  console.log(RegExp.$1);
}

// 提取郵件中的每一部分var reg = /(\w+)@(\w+)\.(\w+)(\.\w+)?/;
var str = "932errewerrw@126.com";
if (reg.test(str)) {
  console.log(RegExp.$1);
  console.log(RegExp.$2);
  console.log(RegExp.$3);
}

3.6 正則運算式替換

// 1.替換所有空白字符var str = "   reeed  asafdre56df   3rfereww  rtere ";
str = str.replace(/\s/g, "***");
console.log(str);

// 2.替換所有,或,var str = "abc,efg,123,abc,123,a";
str = str.replace(/,|,/g, ":");
console.log(str);

4 案例

4.1 表單驗證案例

演示地址:https://www.albertyy.com/2020/10/validate.html

<!DOCTYPE html><html>
        <head>
                <meta charset="utf-8">
                <title>表單驗證:微信公眾號AlbertYang</title>
                <style type="text/css">
                        body {
                                background: #ccc;
                        }

                        label {
                                width: 40px;
                                display: inline-block;
                        }

                        span {
                                color: red;
                        }

                        .container {
                                margin: 100px auto;
                                width: 400px;
                                padding: 50px;
                                line-height: 40px;
                                border: 1px solid #999;
                                background: #efefef;
                        }

                        span {
                                margin-left: 30px;
                                font-size: 12px;
                        }

                        .wrong {
                                color: red
                        }

                        .right {
                                color: green;
                        }

                        .defau {
                                width: 200px;
                                height: 20px;
                        }

                        .de1 {
                                background-position: 0 -20px;
                        }
                </style>

        </head>

        <body>
                <div class="container" id="dv">
                        <label for="qq">Q Q</label><input type="text" id="qq"><span></span><br />
                        <label>手機</label><input type="text" id="phone"><span></span><br />
                        <label>郵箱</label><input type="text" id="e-mail"><span></span><br />
                        <label>座機</label><input type="text" id="telephone"><span></span><br />
                        <label>姓名</label><input type="text" id="fullName"><span></span><br />
                </div>
                <script>
                        // qq
                        checkInput(document.getElementById("qq"), /^\d{5,11}$/);
                        // 手機
                        checkInput(document.getElementById("phone"), /^\d{11}$/);
                        // 郵箱
                        checkInput(document.getElementById("e-mail"), /^[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+([.][a-zA-Z]+){1,2}$/);
                        // 座機號碼
                        checkInput(document.getElementById("telephone"), /^\d{3,4}[-]\d{7,8}$/);
                        // 中文名字
                        checkInput(document.getElementById("fullName"), /^[\u4e00-\u9fa5]{2,6}$/);

                        // 根據文本框和這個文本框相應的正則運算式,驗證當前文本框中的值,與給出的正則運算式否匹配
                        function checkInput(input, reg) {
                                // 文本框失去焦點的事件
                                input.onblur = function() {
                                        if (reg.test(this.value)) {
                                                this.nextElementSibling.innerText = "正確";
                                                this.nextElementSibling.style.color = "green";
                                        } else {
                                                this.nextElementSibling.innerText = "錯誤,請您重新輸入";
                                                this.nextElementSibling.style.color = "red";
                                        }
                                };
                        }
                </script>
        </body></html>

4.2 過濾敏感詞匯案例

演示地址:https://www.albertyy.com/2020/10/filter.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>過濾敏感詞匯:公眾號AlbertYang</title>
	</head>
	<body>
		<textarea name="" id="message"></textarea> <button>提交</button>
		<div></div>
		<script>
			var text = document.querySelector('textarea');
			var btn = document.querySelector('button');
			var div = document.querySelector('div');
			btn.onclick = function() {
				div.innerHTML = text.value.replace(/激情|gay|AV/g, '**');
			}
		</script>
	</body>
</html>

5 總結

本文從正則運算式的基本概念入手,講解了正則運算式的特點和組成,并且詳細講解了正則運算式在JavaScript中的使用,并給出了一些在實際開發中經常用到的實體,對于剛接觸的人來說,正則運算式比較晦澀難懂,比如:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$,在實際開發中,我們一般都是在網上搜索好的正則運算式,能夠根據實際情況修改正則運算式即可,比如用戶名: /^[a-z0-9_-]{3,16}$/,

今天的學習就到這里了,由于本人能力和知識有限,如果有寫的不對的地方,還請各位大佬批評指正,如果想繼續學習提高,歡迎關注我,每天學習進步一點點,就是領先的開始,如果覺得本文對你有幫助的話,歡迎轉發,評論,點贊!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/192410.html

標籤:其他

上一篇:flex(彈性盒子):1的變化,以及flex對width的影響!

下一篇:vue專案實錄:下拉重繪組件的開發及slot的使用

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more