摘要:本文引用至括號匹配括號的匹配無論是在計算器還是在文本輸入中都占很大的比例有時候正則用多了在談到括號匹配的相關內容時可能會劍走偏鋒導致走上不歸路一個很簡單的方法就是使用的方法來實現括號的匹配在介紹最終的之前我們可以來看看幾種比較簡單的或者說要
本文引用至: 括號匹配
括號的匹配,無論是在web 計算器, 還是在文本輸入中, 都占很大的比例. 有時候正則用多了, 在談到括號匹配的相關內容時, 可能會劍走偏鋒. 導致走上不歸路. 一個很簡單的方法就是使用 stack 的方法. 來實現, 括號的匹配.
在介紹最終的stack之前,我們可以來看看,幾種比較簡單的或者說,要求不高的括號匹配.
使用length 屬性當你只需要看看文本里面的內容是否成對時, 那么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
當然, 如果你用這種方法,到你的項目當中, tutor 沒看見還好,如果看見了, 你基本上就跪了. 因為這種方法, 基本上不能用. 首先, 他只是數量上的匹配, 并沒有順序上的匹配. 即: ((([)])) 像這種, 一眼看過去就知道, 這尼瑪肯定出錯了. 但上面的代碼會返回true. 所以,這就尷尬了. 下面,我們就來介紹一下, 如果利用堆棧,進行簡單的順序匹配.
使用堆棧這實際上就是一個小小的算法.
他的整個流程是這樣的:
我們還是直接上代碼吧.
const isComplete = function(str){ // 匹配括號 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; } } // 當存在 (() 這樣的情況時, 上面的都能通過, 最后需要檢測一下arr的長度 return arr.length > 0 ? false : true; } // 測試 console.log(isComplete("()()")); // true
這樣,就沒有什么太大的問題了. 這也是最常用的一種方法. 不過,有時候,我們僅僅只得到true or false. 是沒有什么 x 用的. 所以, 有沒有情況,得到,我們是哪一部分的括號沒有匹配完整的?
找到沒匹配內容ok, 這其實也很簡單. 使用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)"));
當然, 上面那種匹配方法對于這樣的格式fdsfsd(fdsaf)[1231313(fdsf) 有點蛋疼. 因為他最后返回來的是空值. 所以, 這也是一個問題. 不過, 對于一般的數據要求,上面那種方法也是足夠了.
就醬吧.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79769.html
摘要:淺談正則表達式正則表達式是對字符串進行查找替換和提取等操作的工具。參數參數是一個字符串,制訂了正則表達式的模式和其他正則表達式參數是一個可選的字符串,包含屬性,分別用于指定全局匹配區分大小寫的匹配和多行匹配。 淺談正則表達式 正則表達式是對字符串進行查找替換和提取等操作的工具。有兩種寫法: 直接量語法 /pattern/attribues RegExp對象語法 new RegExp(p...
摘要:中的每一個值,都是一種數據,屬于一種數據類型。數值的數值有許多種表示類型。對象這是中最核心的概念,也是最復雜的數據類型。對象的每一個鍵名又稱為屬性,它的鍵值可以是任何數據類型。特例函數返回,但是我們要注意并沒有這一數據類型。 JS中的數據類型。什么是數據類型? 和我們平時交流一樣一樣。什么是漢字,什么是拼音,什么是標點符號,什么又是現在流行的表情包?類型,可以是語言的分類,也一定是理解...
摘要:本文將以此為起點,介紹一些替換小技巧。實話實說,使用命令來替換有違于大多數程序員的習慣。接下更進一步,教多幾個小技巧。這么一來,替換將僅在當前大括號內生效。在替換局部變量時,比起全局替換,這樣的替換方式無疑會更高效。 想必用過Vim的人都知道,在Vim里面,以下命令可以替換當前文件的內容: :[range]s/{要被替換的模式}/{替換的內容}/[flags] 其中range指定替換命...
摘要:在詳解中使用解決了第三方賬號登錄集成的問題,那么在獲取到用戶資料之后呢集成多個社交賬號,該如何綁定同一個賬號本篇就讓我們來探討一下集成登錄的那點事。 Dearmadman 在 Laravel Socialite 詳解 中使用 larastarscn/socialite 解決了第三方賬號登錄集成的問題,那么在獲取到用戶資料之后呢?集成多個社交賬號,該如何綁定同一個賬號?本篇就讓我們來探討...
閱讀 999·2019-08-30 15:55
閱讀 3440·2019-08-30 13:10
閱讀 1268·2019-08-29 18:45
閱讀 2347·2019-08-29 16:25
閱讀 2107·2019-08-29 15:13
閱讀 2422·2019-08-29 11:29
閱讀 552·2019-08-26 17:34
閱讀 1486·2019-08-26 13:57