摘要:本文引用至括號(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
摘要:淺談?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...
摘要:來看看箭頭函數(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...
摘要:中的每一個(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)在流行的表情包?類型,可以是語言的分類,也一定是理解...
摘要:本文將以此為起點(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指定替換命...
摘要:在詳解中使用解決了第三方賬號(hào)登錄集成的問題,那么在獲取到用戶資料之后呢集成多個(gè)社交賬號(hào),該如何綁定同一個(gè)賬號(hào)本篇就讓我們來探討一下集成登錄的那點(diǎn)事。 Dearmadman 在 Laravel Socialite 詳解 中使用 larastarscn/socialite 解決了第三方賬號(hào)登錄集成的問題,那么在獲取到用戶資料之后呢?集成多個(gè)社交賬號(hào),該如何綁定同一個(gè)賬號(hào)?本篇就讓我們來探討...
閱讀 1013·2019-08-30 15:55
閱讀 3454·2019-08-30 13:10
閱讀 1279·2019-08-29 18:45
閱讀 2355·2019-08-29 16:25
閱讀 2120·2019-08-29 15:13
閱讀 2434·2019-08-29 11:29
閱讀 562·2019-08-26 17:34
閱讀 1499·2019-08-26 13:57