成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

淺談括號(hào)匹配

renweihub / 1216人閱讀

摘要:本文引用至括號(hào)匹配括號(hào)的匹配無論是在計(jì)算器還是在文本輸入中都占很大的比例有時(shí)候正則用多了在談到括號(hào)匹配的相關(guān)內(nèi)容時(shí)可能會(huì)劍走偏鋒導(dǎo)致走上不歸路一個(gè)很簡單的方法就是使用的方法來實(shí)現(xiàn)括號(hào)的匹配在介紹最終的之前我們可以來看看幾種比較簡單的或者說要

本文引用至: 括號(hào)匹配

括號(hào)的匹配,無論是在web 計(jì)算器, 還是在文本輸入中, 都占很大的比例. 有時(shí)候正則用多了, 在談到括號(hào)匹配的相關(guān)內(nèi)容時(shí), 可能會(huì)劍走偏鋒. 導(dǎo)致走上不歸路. 一個(gè)很簡單的方法就是使用 stack 的方法. 來實(shí)現(xiàn), 括號(hào)的匹配.

在介紹最終的stack之前,我們可以來看看,幾種比較簡單的或者說,要求不高的括號(hào)匹配.

使用length 屬性

當(dāng)你只需要看看文本里面的內(nèi)容是否成對(duì)時(shí), 那么length屬性,無疑是最快的選擇.
看代碼吧:

const isComplete = function(str) {
    let left = ["(", "[", "{"],
        right = [")", "]", "}"],
        reg;
    left.map((val) => {
        reg = new RegExp("" + val, "g");
        match = str.match(reg);
        return match ? match.length : 0;
    })
    right.map((val) => {
        reg = new RegExp("" + val, "g");
        match = str.match(reg);
        return match ? match.length : 0;
    })
    for (var i in left) {
        if (left[i] !== right[i]) return false;
    }
    return true;
}
// 測試用例
console.log(isComplete("[][][()")); // false

當(dāng)然, 如果你用這種方法,到你的項(xiàng)目當(dāng)中, tutor 沒看見還好,如果看見了, 你基本上就跪了. 因?yàn)檫@種方法, 基本上不能用. 首先, 他只是數(shù)量上的匹配, 并沒有順序上的匹配. 即: ((([)])) 像這種, 一眼看過去就知道, 這尼瑪肯定出錯(cuò)了. 但上面的代碼會(huì)返回true. 所以,這就尷尬了. 下面,我們就來介紹一下, 如果利用堆棧,進(jìn)行簡單的順序匹配.

使用堆棧

這實(shí)際上就是一個(gè)小小的算法.
他的整個(gè)流程是這樣的:

我們還是直接上代碼吧.

const isComplete = function(str){
    // 匹配括號(hào)
    let brackets = str.match(/[[]()]/g),
        arr = [],
        symbol;
    for (var i in brackets) {
            switch (brackets[i]) {
                case "(":
                    arr.push("(");
                    break;
                case "[":
                    arr.push("[");
                    break;
                case ")":
                    symbol = arr.pop();
                    if (symbol !== "(") return false;
                    break;
                case "]":
                    symbol = arr.pop();
                    if (symbol !== "[") return false;
                    break;
            }
        }
        // 當(dāng)存在 (() 這樣的情況時(shí), 上面的都能通過, 最后需要檢測一下arr的長度
        return arr.length > 0 ? false : true;
}
 // 測試
 console.log(isComplete("()()")); // true

這樣,就沒有什么太大的問題了. 這也是最常用的一種方法. 不過,有時(shí)候,我們僅僅只得到true or false. 是沒有什么 x 用的. 所以, 有沒有情況,得到,我們是哪一部分的括號(hào)沒有匹配完整的?

找到?jīng)]匹配內(nèi)容

ok, 這其實(shí)也很簡單. 使用index, 再搭配上split方法即可.
我們直接看代碼吧:

const isComplete = function(str) {
    // 提取()[]
    let brackets = str.match(/[[]()]/g);

    let flag = (function() {
        let arr = [],
            symbol;
        for (var i in brackets) {
            switch (brackets[i]) {
                case "(":
                    arr.push({
                        symbol: "(",
                        index: i
                    });
                    break;
                case "[":
                    arr.push({
                        symbol: "[",
                        index: i
                    });
                    break;
                case ")":
                    if (arr.length === 0) return i
                    item = arr.pop();
                    if (item.symbol !== "(") return item.index;
                    break;
                case "]":
                    if (arr.length === 0) return i
                    item = arr.pop();
                    if (item.symbol !== "[") return item.index;
                    break;
            }
        }
        return arr.length > 0 ? arr[0].index : true;
    })();
    if (flag !== true) {
        brackets = str.split(/[[]()]/);
        return brackets[flag];
    }
    return true;
}
// 測試 
console.log(isComplete("fdsfsd(fdsaf)fdsf[1231313(fdsf)"));

當(dāng)然, 上面那種匹配方法對(duì)于這樣的格式fdsfsd(fdsaf)[1231313(fdsf) 有點(diǎn)蛋疼. 因?yàn)樗詈蠓祷貋淼氖强罩? 所以, 這也是一個(gè)問題. 不過, 對(duì)于一般的數(shù)據(jù)要求,上面那種方法也是足夠了.
就醬吧.

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79769.html

相關(guān)文章

  • 淺談正則表達(dá)式

    摘要:淺談?wù)齽t表達(dá)式正則表達(dá)式是對(duì)字符串進(jìn)行查找替換和提取等操作的工具。參數(shù)參數(shù)是一個(gè)字符串,制訂了正則表達(dá)式的模式和其他正則表達(dá)式參數(shù)是一個(gè)可選的字符串,包含屬性,分別用于指定全局匹配區(qū)分大小寫的匹配和多行匹配。 淺談?wù)齽t表達(dá)式 正則表達(dá)式是對(duì)字符串進(jìn)行查找替換和提取等操作的工具。有兩種寫法: 直接量語法 /pattern/attribues RegExp對(duì)象語法 new RegExp(p...

    lookSomeone 評(píng)論0 收藏0
  • 淺談箭頭函數(shù)

    摘要:來看看箭頭函數(shù)的情況可以發(fā)現(xiàn)在定時(shí)器這個(gè)匿名函數(shù)作用域里,所指向的對(duì)象,就是定義時(shí)所指的對(duì)象。對(duì)于構(gòu)造函數(shù)來說,它就是的實(shí)例。如下?lián)?,總結(jié)箭頭函數(shù)的三個(gè)優(yōu)點(diǎn)語法簡潔,能夠?qū)懗銎恋膯涡泻瘮?shù)。 ES6新引入了箭頭函數(shù),它是一種表達(dá)簡潔的函數(shù),下面我們來看看它有哪三個(gè)顯著優(yōu)勢。假設(shè)定義了一個(gè)名為names的數(shù)組,如下: showImg(https://segmentfault.com/i...

    NoraXie 評(píng)論0 收藏0
  • 淺談JS中的數(shù)據(jù)類型

    摘要:中的每一個(gè)值,都是一種數(shù)據(jù),屬于一種數(shù)據(jù)類型。數(shù)值的數(shù)值有許多種表示類型。對(duì)象這是中最核心的概念,也是最復(fù)雜的數(shù)據(jù)類型。對(duì)象的每一個(gè)鍵名又稱為屬性,它的鍵值可以是任何數(shù)據(jù)類型。特例函數(shù)返回,但是我們要注意并沒有這一數(shù)據(jù)類型。 JS中的數(shù)據(jù)類型。什么是數(shù)據(jù)類型? 和我們平時(shí)交流一樣一樣。什么是漢字,什么是拼音,什么是標(biāo)點(diǎn)符號(hào),什么又是現(xiàn)在流行的表情包?類型,可以是語言的分類,也一定是理解...

    lufficc 評(píng)論0 收藏0
  • Vim替換小技巧(兼淺談Vim哲學(xué))

    摘要:本文將以此為起點(diǎn),介紹一些替換小技巧。實(shí)話實(shí)說,使用命令來替換有違于大多數(shù)程序員的習(xí)慣。接下更進(jìn)一步,教多幾個(gè)小技巧。這么一來,替換將僅在當(dāng)前大括號(hào)內(nèi)生效。在替換局部變量時(shí),比起全局替換,這樣的替換方式無疑會(huì)更高效。 想必用過Vim的人都知道,在Vim里面,以下命令可以替換當(dāng)前文件的內(nèi)容: :[range]s/{要被替換的模式}/{替換的內(nèi)容}/[flags] 其中range指定替換命...

    ConardLi 評(píng)論0 收藏0
  • 淺談多個(gè)社交賬號(hào)的綁定設(shè)計(jì)

    摘要:在詳解中使用解決了第三方賬號(hào)登錄集成的問題,那么在獲取到用戶資料之后呢集成多個(gè)社交賬號(hào),該如何綁定同一個(gè)賬號(hào)本篇就讓我們來探討一下集成登錄的那點(diǎn)事。 Dearmadman 在 Laravel Socialite 詳解 中使用 larastarscn/socialite 解決了第三方賬號(hào)登錄集成的問題,那么在獲取到用戶資料之后呢?集成多個(gè)社交賬號(hào),該如何綁定同一個(gè)賬號(hào)?本篇就讓我們來探討...

    wean 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

renweihub

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<