如何匹配未被括号与引号包裹的空格?
匹配括号与引号外空格的正则及括号引号匹配检查方案
一、匹配目标空格的正则表达式
针对你需要匹配括号和引号之外的空格的需求,结合嵌套括号的处理,可使用如下正则表达式(JavaScript环境):
/\s+(?=(?:[^"()]*"(?:\\.|[^"])*"|[^"()]*\((?:[^"()]|"(?:\\.|[^"])*")*\))*[^"()]*$)/g
正则逻辑说明
\s+:匹配1个或多个连续空格- 正向预查
(?=...)确保当前空格处于合法范围:- 循环匹配两种成对结构,直到字符串末尾:
[^"()]*"(?:\\.|[^"])*":匹配成对的双引号,支持转义引号(如\"),忽略引号内的所有内容[^"()]*\((?:[^"()]|"(?:\\.|[^"])*")*\):匹配成对的括号(支持嵌套),括号内允许包含引号或其他非括号/引号字符
[^"()]*$:匹配剩余的非引号、非括号字符,确保当前空格后没有未闭合的引号或括号
- 循环匹配两种成对结构,直到字符串末尾:
将该正则应用到你的示例字符串0 " 1 2 "3 ( 4 5 )6 ( ( 7 ) ( "("8 ) )9 " ( A B C ) ) ( D E F ( "),会精准匹配到0、3、6、9之后的空格。
二、检查括号与引号是否匹配的JavaScript实现
以下代码可检测字符串中未闭合的引号、多余的右括号或未闭合的左括号:
function checkUnbalancedSyntax(str) { const errorList = []; let inQuotes = false; let isEscaping = false; const bracketPositions = []; for (let idx = 0; idx < str.length; idx++) { const char = str[idx]; // 处理转义字符,跳过下一个字符 if (isEscaping) { isEscaping = false; continue; } if (char === '\\') { isEscaping = true; continue; } // 切换引号状态 if (char === '"') { inQuotes = !inQuotes; continue; } // 引号内的括号不做检查 if (inQuotes) continue; // 处理括号 if (char === '(') { bracketPositions.push(idx); } else if (char === ')') { if (bracketPositions.length === 0) { errorList.push(`多余的右括号,位置:${idx}`); } else { bracketPositions.pop(); } } } // 检查未闭合的引号 if (inQuotes) { errorList.push('存在未闭合的双引号'); } // 检查未闭合的左括号 bracketPositions.forEach(pos => { errorList.push(`未闭合的左括号,位置:${pos}`); }); return errorList.length ? errorList : '所有括号与引号均匹配'; } // 测试示例 const testString = `0 " 1 2 "3 ( 4 5 )6 ( ( 7 ) ( "("8 ) )9 " ( A B C ) ) ( D E F ( "`; console.log(checkUnbalancedSyntax(testString)); // 输出:["存在未闭合的双引号", "未闭合的左括号,位置:47"]
内容的提问来源于stack exchange,提问作者nonhuman
相关产品推荐
相关产品推荐

