资讯专栏INFORMATION COLUMN

浅谈括号匹配

renweihub / 1017人阅读

摘要:本文引用至括号匹配括号的匹配无论是在计算器还是在文本输入中都占很大的比例有时候正则用多了在谈到括号匹配的相关内容时可能会剑走偏锋导致走上不归路一个很简单的方法就是使用的方法来实现括号的匹配在介绍最终的之前我们可以来看看几种比较简单的或者说要

本文引用至: 括号匹配

括号的匹配,无论是在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) 有点蛋疼. 因为他最后返回来的是空值. 所以, 这也是一个问题. 不过, 对于一般的数据要求,上面那种方法也是足够了.
就酱吧.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79769.html

相关文章

  • 浅谈正则表达式

    摘要:浅谈正则表达式正则表达式是对字符串进行查找替换和提取等操作的工具。参数参数是一个字符串,制订了正则表达式的模式和其他正则表达式参数是一个可选的字符串,包含属性,分别用于指定全局匹配区分大小写的匹配和多行匹配。 浅谈正则表达式 正则表达式是对字符串进行查找替换和提取等操作的工具。有两种写法: 直接量语法 /pattern/attribues RegExp对象语法 new RegExp(p...

    lookSomeone 评论0 收藏0
  • 浅谈箭头函数

    摘要:来看看箭头函数的情况可以发现在定时器这个匿名函数作用域里,所指向的对象,就是定义时所指的对象。对于构造函数来说,它就是的实例。如下据此,总结箭头函数的三个优点语法简洁,能够写出漂亮的单行函数。 ES6新引入了箭头函数,它是一种表达简洁的函数,下面我们来看看它有哪三个显著优势。假设定义了一个名为names的数组,如下: showImg(https://segmentfault.com/i...

    NoraXie 评论0 收藏0
  • 浅谈JS中的数据类型

    摘要:中的每一个值,都是一种数据,属于一种数据类型。数值的数值有许多种表示类型。对象这是中最核心的概念,也是最复杂的数据类型。对象的每一个键名又称为属性,它的键值可以是任何数据类型。特例函数返回,但是我们要注意并没有这一数据类型。 JS中的数据类型。什么是数据类型? 和我们平时交流一样一样。什么是汉字,什么是拼音,什么是标点符号,什么又是现在流行的表情包?类型,可以是语言的分类,也一定是理解...

    lufficc 评论0 收藏0
  • Vim替换小技巧(兼浅谈Vim哲学)

    摘要:本文将以此为起点,介绍一些替换小技巧。实话实说,使用命令来替换有违于大多数程序员的习惯。接下更进一步,教多几个小技巧。这么一来,替换将仅在当前大括号内生效。在替换局部变量时,比起全局替换,这样的替换方式无疑会更高效。 想必用过Vim的人都知道,在Vim里面,以下命令可以替换当前文件的内容: :[range]s/{要被替换的模式}/{替换的内容}/[flags] 其中range指定替换命...

    ConardLi 评论0 收藏0
  • 浅谈多个社交账号的绑定设计

    摘要:在详解中使用解决了第三方账号登录集成的问题,那么在获取到用户资料之后呢集成多个社交账号,该如何绑定同一个账号本篇就让我们来探讨一下集成登录的那点事。 Dearmadman 在 Laravel Socialite 详解 中使用 larastarscn/socialite 解决了第三方账号登录集成的问题,那么在获取到用户资料之后呢?集成多个社交账号,该如何绑定同一个账号?本篇就让我们来探讨...

    wean 评论0 收藏0

发表评论

0条评论

renweihub

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<