首先对**大写的ZDQ**博主的感谢,灵感源于此.
判断括号是否匹配–JavaScript
根据给定的一段字符串,判断字符串中的括号()[]{}是否按规则一一对应
思路
括号一定是成对出现的.
字符串中遇到的闭合括号,一定是和它的前一个开始括号是一对.
说明
如果匹配正确,返回 -1
如果匹配错误,返回 索引值
如果是单纯的判断,也可以改成 布尔值.
兼容写法
function isValid(str){
if(!str.trim()) return -1;
var stack = [];
var keys = [')',']','}'];
var values = ['(','[','{'];
var isBreak = -1;
for(var i=0;i<str.length;i++){
var char = str.charAt(i);
if(values.includes(char)){
// 开始
stack.push(char);
}else{
var index = keys.indexOf(char);
if(index > -1){
// 闭合
if(!stack.length || values[index] != stack.pop()){
isBreak = i;
break;
}
}
}
}
if(isBreak > -1){
return isBreak
}
return stack.length - 1
}
简单写法
IE 不兼容,主要是因为用到了ES6的语法
function isValid(str){
if(!str.trim()) return -1;
var stack = [];
var dict = {"]": "[", "}": "{", ")": "("};
var values = Object.values(dict);
var isBreak = -1;
for(var i=0;i<str.length;i++){
var char = str.charAt(i);
if(values.includes(char)){
stack.push(char);
}else if(dict[char]){
if(!stack.length || dict[char] != stack.pop()){
isBreak = i;
break;
}
}
}
if(isBreak > -1){
return isBreak
}
return stack.length - 1
}
验证
document.write('() : '+isValid('()'));
document.write('<br>');
document.write('()[]{} : '+isValid('()[]{}'));
document.write('<br>');
document.write('(] : '+isValid('(]'));
document.write('<br>');
document.write('([)] : '+isValid('([)]'));
document.write('<br>');
document.write('{[]} : '+isValid('{[]}'));
document.write('<br>');
document.write('(()()) : '+isValid('(()())'));
document.write('<br>');
document.write('((() : '+isValid('((()'));
参考:
https://blog.csdn.net/u010712012/article/details/83856371