编写校验函数:判断用户是否在嵌套括号内输入textarea内容
解决方案
问题回顾
我有一个textarea,默认可包含任意类型的字符串,用户仅能在成对的括号(如Leave[])内部输入内容,外部无法输入;支持n层嵌套结构(如Leave[ Nested[ Test[] ] ])。需要实现函数判断用户是否在括号内输入,是则返回true,否则返回false:
const checkIfTypingBetweenBrackets=(prev:string,current:string):boolean =>{ // Code goes here }
核心思路
要验证输入合法性,关键是定位用户输入的起始位置,再计算该位置前的括号平衡度:
- 遇到
[时平衡度+1,遇到]时平衡度-1 - 若输入位置的平衡度>0,说明处于未闭合的括号内部,返回
true;否则返回false
代码实现
const checkIfTypingBetweenBrackets = (prev: string, current: string): boolean => { // 找到两个字符串的第一个差异位置,即输入操作的起始点 let diffIndex = 0; const minLength = Math.min(prev.length, current.length); while (diffIndex < minLength && prev[diffIndex] === current[diffIndex]) { diffIndex++; } // 计算从字符串开头到输入位置的括号平衡度 let bracketBalance = 0; for (let i = 0; i < diffIndex; i++) { const char = current[i]; if (char === '[') { bracketBalance++; } else if (char === ']') { // 避免无效的多余闭合括号干扰平衡计算 if (bracketBalance > 0) { bracketBalance--; } } } // 平衡度>0意味着处于未闭合的括号内部 return bracketBalance > 0; };
逻辑说明
- 定位输入位置:逐字符对比
prev和current,第一个不同的索引就是用户输入/修改的起始位置。 - 计算括号平衡:从字符串开头遍历到输入位置,统计
[和]的数量差,忽略无效的多余闭合括号(避免平衡度出现负数)。 - 合法性判断:平衡度大于0时,当前输入位置处于至少一层未闭合的括号内部,返回
true;反之则返回false。
内容的提问来源于stack exchange,提问作者Waseem Munir
相关产品推荐
相关产品推荐

