Web前端Javascript筆記(6)正則表達式

        在web前端中,假設用戶需要提交表單,在表單提交到服務器進一步處理之前,Javascript程序會檢查表單,以確認用戶輸入的信息是符合規範要求的。這些工作可以使用正則表達式完成,正則表達式是一個描述字符模式的對象,ECMAscript的RegExp類表示正則表達式。在正則表達式中,定義了功能強大的【模式匹配】,【文本檢索】,【替換】函數。

正則表達式創建:   ig忽略大小寫和全局匹配,全局匹配表示是匹配/替換 所有的滿足條件的,否則只返回第一個

<script>
        let box0 = new RegExp("box", "ig");  // 匹配字符串(主體),匹配模式(修飾符)
        let box1 = RegExp("box", "ig");  // 匹配字符串(主體),匹配模式(修飾符)
        let box2 = /box/ig;
</script>

正則表達式對象的屬性和方法:

1. test  

    格式是: 正則.test(string):  在字符串中匹配正則是否存在, 返回布爾值

2.exec

    格式是: 正則.exec(string):  在字符串中匹配正則是否存在, 返回數組,數組中存儲的是匹配到的字符,匹配失敗返回的是null

3. 在字符串中的很多方法都可以使用正則表達式:參數是正則表達式

match()  , 在字符串中匹配是否有合法的正則,返回值: 數組和null

replace(),  字符串.replace(oldstr/ RegExp, newstr), 用新的字符串匹配就的字符串,舊的字符串可以用正則表示

返回值: 替換成功的新字符串

split() ,字符串分割,分隔符可以是正則表達式,返回值是分割後的字符串

search(), 字符串搜索,參數可以是正則表達式, 返回值:>=0的下標, 否則返回值爲-1

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        let box = RegExp("are");  // 匹配字符串(主體),匹配模式(修飾符)
        let sen = "How are you";
        alert(box.test(sen));

        let box1 = RegExp("are", "i");    // 忽略大小寫
        let sen1 = "How Are you";
        alert(box1.test(sen1));

    </script>
</head>
<body>

</body>
</html>

元字符:

在正則表達式中有特殊含義的字符

1. 單個數字和字符的元字符

"."表示可以匹配任何單個字符

[ ] 匹配單個範圍內的字符 , 例如[a-z][A-Z][0-9], 匹配單個數字或者字母,[a-zA-Z0-9_],匹配單個數字,字母或者下劃線

[^]與[ ]匹配的內容相反,例如 [^0-9]匹配處0-9之外的單個字符

\w 匹配數字,字母或者下劃線,等價於[a-zA-Z0-9_]

\W 與\w正好相反

\d 表示匹配單個數字,等價於[0-9]

\D表示匹配非數字

2. 重複字符:(假設x代表任意的單個字符)

x?  表示匹配0或者1個字符x

x*  表示匹配任意多個字符x

x+ 表示匹配1或者多個字符x(至少一個)

x{m,n}匹配至少m個,最多n個字符

x{n}  表示必須匹配n個字符x

(xyz)+  此時括號裏面的內容xyz是當作單個字符去處理的

3. 空白字符

空白字符包括:

(null字符,空格字符,進紙字符,換行字符,回車字符,製表符等等)

\s 匹配任意單個的空白字符

\S 匹配任意單個的非空白字符

4. 錨字符

^  行首匹配

$  行尾匹配

例如: ^g.*d$ 匹配的字符串必須以g開頭,以d結尾。

5. 替代字符

|  表示或運算字符 

6. 修飾符

i    忽略大小寫

g    全局匹配

m   換行匹配

7.轉義字符:

\.   代表本來 . 字符的意思

\*   代表本來*字符的意思

正則表達式應用:

1. 匹配壓縮文件

<script>
        let reg = /^\w+\.(zip|rar|gz)$/;
        let file_name = "shell.rar";
        alert(reg.test(file_name));
</script>

2. 匹配手機號

<script>
        let phone_reg = /^1[0-9]{10}/
        alert(phone_reg.test("18834659876"));
</script>

3. 驗證身份證號:

<script>
        let id_reg = /^[1-9]\d{16}(\d|x)$/i;
        alert(id_reg.test("62172118850265478X"));
</script>

4. 驗證中文字符串

<script>
        let chinese_reg = /^[\u4e00-\u9fa5]+$/;
        alert(chinese_reg.test("前端腳本"));
</script>

表單驗證與密碼強度:

1.驗證用戶名的合法性,包括用戶名的長度,字母開頭,只能包含數字,字母,下劃線

2. 密碼強度驗證,包括密碼的長度,強度等級劃分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script rel="script" src="../JavaScript/tool.js"></script>
    <script>
        window.onload = function () {
            let tag_userName = $("username");
            let tag_password = $("passwd");
            let tag_span = $("username-span");
            let tag_code = $("code");
            let tag_testCode = tag_code.getElementsByTagName("div");
            tag_userName.onblur = function () {
                let username = tag_userName.value;
                // 判斷長度
                if(username.length < 6 || username.length >18)
                {
                    tag_span.innerHTML = "!用戶名長度6~18";
                    tag_span.style.color = "red";
                }
                //判斷首字母開頭
                else if(! /[a-zA-Z]/.test(username[0]))
                {
                    tag_span.innerHTML = "!用戶名必須以字母開頭";
                    tag_span.style.color = "red";
                }
                else if (/\W/.test(username))
                {
                    tag_span.innerHTML = "!用戶名只能包含數字字母下劃線";
                    tag_span.style.color = "red";
                }
                else
                {
                    tag_span.innerHTML = "!該用戶名可註冊";
                    tag_span.style.color = "green";
                }

            };

            tag_password.onkeyup = function () {
                let password = tag_password.value;
                if(password.length >= 6)
                {
                    // 可以開始驗證密碼強度
                    // 分類
                    // 1. 弱密碼: 純數字 純小寫 純大寫
                    // 2. 中密碼: 兩者混合
                    // 3. 三種混合
                    if (/^[0-9]+$/.test(password) || /^[a-z]+$/.test(password) ||/^[A-Z]+$/.test(password))
                    {
                        tag_testCode[0].style.background = "orange";
                        tag_testCode[1].style.background = "gray";
                        tag_testCode[2].style.background = "gray";
                    }
                    else if(/\d/.test(password) && /[a-z]/.test(password) && /[A-Z]/.test(password))
                    {
                        tag_testCode[0].style.background = "gray";
                        tag_testCode[1].style.background = "gray";
                        tag_testCode[2].style.background = "orange";
                    }
                    else
                    {
                        tag_testCode[0].style.background = "gray";
                        tag_testCode[1].style.background = "orange";
                        tag_testCode[2].style.background = "gray";
                    }
                }
            }
        }
    </script>
    <style>
        #form{
            width: 300px;
            height: 200px;
            margin: 20px auto;
            border: 1px solid black;
            background: #66c5b4;
            text-align: center;
        }

        #form #username{
            margin: 40px 5px 10px 5px;
        }

        #username-span{
            display: block;
            font-size: 10px;
            height: 16px;
            line-height: 16px;
            color: gray;
        }

        #passwd{
            margin: 10px 0 0 0;
        }

        #code
        {
            height: 30px;
            margin: 10px 60px 0 60px;
        }
        #code .testCode{
            width: 60px;
            height: 25px;
            line-height: 25px;
            background: gray;
            color: black;
            text-align: center;
            float: left;
        }

    </style>
</head>
<body>
<div id="form">
    <input id="username" type="text" placeholder="郵箱">
    <span id="username-span">字母,數字,下劃線,長度6~18</span>
    <input id="passwd" type="password" placeholder="密碼">
    <!--密碼輕度-->
    <div id="code">
        <div class="testCode">若</div>
        <div class="testCode">中</div>
        <div class="testCode">強</div>
    </div>
</div>
</body>
</html>

localStore本地存儲:

在HTML5中,加入了一個localStorage特性,主要用來作爲本地存儲使用,解決了cookie存儲空間不足的問題,cookie中每條cookie的存儲空間爲4k,localStorage中瀏覽器支持的是5M大小。

例如,首次登陸,點擊記住用戶名和密碼,下次登陸就無需在輸入用戶名和密碼

本地存儲技術:

localStorage:  1. 永久存儲     2.最大支持5M (客戶端微型數據庫)     3. 只能存儲字符串
cookie:  1. 可以設置過期時間     2.  最大可以存儲4k   3.  每一個域名下最多可以存儲50條數據

sessionStorage :  (結合後臺使用)

--------------------------------------------------------------------------------------------------------------------

localStorage對象:

1. setItem(name, value)

2. getItem(name, value)

3. removeItem(name, value)

<script>
        if (!window.localStorage)
        {
            alert("不支持localStore");
        }
        else
        {
            localStorage.setItem("name", "kitty");
            localStorage.setItem("age", "33");
        }
        window.onclick = function () {
            alert(localStorage.getItem("name"));
            localStorage.removeItem("age");
        }
</script>

localStorage應用:

在頁面刷新後,依然能夠保持頁面的狀態:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script rel="script" src="../JavaScript/tool.js"></script>
    <script>
        window.onload = function () {
            let slide = $("slide");
            let full = $("full");
            let block = $("block");

            // 加載本地存儲的位置信息
            if (!window.localStorage)
            {
                alert("不支持localStorage");
            }
            else
            {
                let pos = localStorage.getItem("position");
                if (pos){
                    block.style.left = pos + "px";
                    full.style.width = pos + "px";
                }
                else{
                    pos = 0;
                    block.style.left = pos + "px";
                    full.style.width = pos + "px";
                }
            }

            block.onmousedown = function (ev) {
                let e = ev || window.event;
                let offset_x = e.clientX - slide.offsetLeft;

                document.onmousemove = function (ev) {
                    let e = ev || window.event;
                    let current_x = e.clientX - slide.offsetLeft;
                    if (current_x < 0)
                    {
                        current_x = 0;
                    }
                    if(current_x > slide.offsetWidth - block.offsetWidth)
                    {
                        current_x = slide.offsetWidth - block.offsetWidth;
                    }
                    block.style.left = current_x + "px";
                    full.style.width = current_x + "px";

                    // 對滑塊的位置進行存儲到本地
                    if (window.localStorage) {
                        localStorage.setItem("position", current_x.toString());
                    }
                    else {
                        alert("不支持storage");
                    }
                }
            };
            window.onmouseup = function () {
                document.onmousemove = null;
            };
        }
    </script>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        #slide{
            position: relative;
            width: 600px;
            height: 30px;
            border: 1px solid black;
            margin: 100px auto;
        }
        #block{
            width: 30px;
            height: 30px;
            background-color: blue;
            position: absolute;
            left: 0;
            top: 0;
        }
        #full
        {
            width: 0;
            height: 30px;
            background-color: orange;
            position: absolute;
            top: 0;
            left: 0;
        }
    </style>
</head>
<body>
    <div id="slide">
        <div id="full"></div>
        <div id="block"></div>
    </div>
</body>
</html>

在頁面上拖動進度條之後,即使刷新頁面,也會保持上次的進度條的位置。

強制改變this指向:

每一個函數中都有一個內置的變量this,this指向當前函數的主人,函數的主人需要根據上下文進行判斷

強制數據類型轉換:強制使得this指向統一的對象
1. call

例如,定義show(x, y)函數

格式:通過show.call()調用函數

參數:show.call(newObj, x, y)     newObj表示新綁定的對象,後面的表示函數參數

<script>
        function show(x, y) {
            alert(this);    // this->window
            alert(x + "," + y);
        }
        show(1,2);
        show.call("call", 1, 2);   // this->call
</script>

2.apply()方法

 格式:show.apply()

參數: show.apply(newObj, [x, y]);

<script>
        function show(x, y) {
            alert(this);    // this->window
            alert(x + "," + y);
        }
        show(1,2);
        show.apply("call", [1, 2]);   // this->call
</script>

3. bind()方法:預設this指向

格式:show.bind(newObj)

返回值:在執行show.bind(newObj)之後,show函數並不會被執行,而是會返回一個show()函數,但是此時的show()函數中this已經指向了newObj。

<script>
        function show(x, y) {
            alert(this);    // this->window
            alert(x + "," + y);
        }
        show(1,2);
        let show1 = show.bind("call");
        show1(4,5);
</script>

apply使用技巧,在Math.min()和Math.max()中,查找數組的最大最小值,由於Math.min()和Math.max()只能傳入一個一個的數,如果想找到數組中的最值,可以藉助apply方法:

<script>
        alert(Math.max(1,2,3,4,5));
        alert(Math.max.apply("null", [1,2,3,4,5]));
</script>

let和const關鍵字:

let關鍵字:用於聲明變量,變量作用域範圍更小,只要遇到大括號,就形成作用域,例如,for循環,if判斷,switch條件判斷

var關鍵字:用於聲明變量,且聲明的變量是要遵循內存的垃圾回收機制,即將當前函數所在的大括號最爲一個作用域進行處理。

所以將let關鍵字形成的作用域稱爲塊作用域,將var關鍵字形成的作用域稱爲局部作用域。

例如:

<script>
        window.onload = function () {
            let btns = document.getElementsByTagName("button");
            for (var i=0; i<btns.length; i++)
            {
                btns[i].onclick = function () {
                    alert(i);
                }
            }    // 每個按鈕都哦輸出的是3,for循環下是整個作用域

            for (let i=0; i<btns.length; i++)
            {
                btns[i].onclick = function () {
                    alert(i);
                }
            }    // 因爲每次循環,都會i都會產生一個獨立的作用域,所以會生成三個獨立的作用域
            // 所以輸出的是0,1,2;

        }
</script>

const關鍵字:用於聲明常量,變量的值只能在聲明的時候確定,後續不能修改

箭頭函數

一種新的函數的寫法,只是寫法上的一種改變,並沒有實質上新的功能,也沒有對程序的執行效率有所提高,且這樣的代碼可讀性不好。由於不推薦,就不深入學習了。

<script>
        window.onload = function () {
            function add(x) {
                return x+10;
            }
            
            // 箭頭函數的寫法
            var add = x => x + 10;

        }
</script>

解構與ECMA6字符串:

解構:
1. 中括號解構

2. 大括號解構

<script>
        window.onload = function () {
            // 中括號解構
            let x, y, z = [1, 2, 3];
            alert(x + "," + y + "," + z);
            // 大括號解構
            let {name, age} = {
                name: "wang",
                age: "23"
            }
        }
</script>

解構的應用:

1. 可以很方便的交換兩個變量的值

2. 使得函數可以返回多個值

3. 函數定義參數,傳入參數的順序

<script>
        window.onload = function () {
            // 1. 交換值
            [x, y] = [1, 2];
            [x, y] = [y, x];

            // 2. 返回值
            function test() {
                return [12, 45, 11];
            }
            [a, b, c] = test();

            // 3. 傳參順序
            function show({name, age=13, sex}) {
                alert("I am " + name + "," + age + "years old" + "," +sex);
            }
            show({     // 參數的順序可以打亂, 參數還可以有默認值
                age: 13,
                sex: "female",
                name: "zhang"
            })
        }
</script>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章