You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何匹配未被括号与引号包裹的空格?

匹配括号与引号外空格的正则及括号引号匹配检查方案

一、匹配目标空格的正则表达式

针对你需要匹配括号和引号之外的空格的需求,结合嵌套括号的处理,可使用如下正则表达式(JavaScript环境):

/\s+(?=(?:[^"()]*"(?:\\.|[^"])*"|[^"()]*\((?:[^"()]|"(?:\\.|[^"])*")*\))*[^"()]*$)/g

正则逻辑说明

  • \s+:匹配1个或多个连续空格
  • 正向预查(?=...)确保当前空格处于合法范围:
    • 循环匹配两种成对结构,直到字符串末尾:
      1. [^"()]*"(?:\\.|[^"])*":匹配成对的双引号,支持转义引号(如\"),忽略引号内的所有内容
      2. [^"()]*\((?:[^"()]|"(?:\\.|[^"])*")*\):匹配成对的括号(支持嵌套),括号内允许包含引号或其他非括号/引号字符
    • [^"()]*$:匹配剩余的非引号、非括号字符,确保当前空格后没有未闭合的引号或括号

将该正则应用到你的示例字符串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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:46:24