需求:判断字符串中的括号使用是否合理
思路:由于,括号是穿插于字符之间的,字符与字符的组合形式众多,无法直接判断出括号的使用情况;换个思路,可以从括号本身使用的方法入手:1. 成对出现 2.形式固定
代码如下:
/* 判断字符串中的括号 ()[]{} 使用是否合法 */
function checkBracketsIsValid(str) {
// 采用正则匹配,获取到只有括号的字符串
let bracketsStr = str.match(/[\(\)\[\]\{\}]/g);
bracketsStr = bracketsStr ? bracketsStr.join('') : '';
// 采用递归,用 replace 逐个将成对的括号剥离出原字符串
function spliceBrackets(theStr = '') {
const result = theStr.match(/\(\)|\[\]|\{\}/);
// 存在成对的括号,将其 replace,进入下一次递归;不存在,判断字符串长度
return result ? spliceBrackets(theStr.replace(result[0], '')) : theStr === '';
}
// 1.如果只有括号的字符串长度为偶,则进入递归,判断括号成对情况;否则,字符串中的括号不合法,返回 false;
// 2.递归:字符串抽离到最后,如果长度为0,则字符串中的括号合法,返回 false;否则,字符串中的括号不合法,返回 false。
return (bracketsStr.length) % 2 === 0 ? spliceBrackets(bracketsStr) : false
}
checkBracketsIsValid('([{]})'); // false
checkBracketsIsValid('([]{})'); // true
checkBracketsIsValid('([]{}]'); // false
checkBracketsIsValid(''); // true
小结:通过将所有的括号字符提取出来,然后,依次将成对的括号给删掉,最后,如果还有剩余字符,则表示存在括号使用不规范的情况,如果为空字符串,则括号均为合理使用。
仅供来日回顾参考。