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

如何实现带嵌套括号的+与|运算符字符串表达式解析?

简介

我正在尝试基于给定的过滤字符串创建一个字符串过滤函数,已实现类似"some+string|(test+(another|value))"这类表达式的解析代码。

问题

我需要基于字符串中的运算符解析表达式,使用"+"和"|"作为运算符:

  • "+":紧邻字符串时表示字符串拼接;与括号内表达式结合时,表示与括号表达式的结果进行拼接。
  • "|":表示“逻辑或”,简单示例:(a|b) = ['a', 'b']

我已实现无嵌套括号的表达式解析,但不知道如何处理括号嵌套的情况。

示例1(预期结果)

输入字符串: ((some+test)|((figure+(10|20))+(circle+figure|(3d)))+(free|frau)

输出数组:

[
    "some test free", "figure 10 circle figure free", "figure 20 circle figure free", "figure 10 3d free", "figure 20 3d free",
    "some test frau", "figure 10 circle figure frau", "figure 20 circle figure frau", "figure 10 3d frau", "figure 20 3d frau",
];

示例2

输入字符串: "((some+test)|((figure+(10|20))+(circle+figure|(3d)))|(free|frau)"

输出数组:

[
    "some test", "figure 10 circle figure", "figure 10 3d", "figure 20 circle figure", "figure 20 3d", "free", "frau"
];

通过示例可明确预期结果。我已将任务拆分,现有辅助函数可将带括号的表达式拆分为包含运算符的数组和子数组,但仍无法按照+和|的逻辑递归处理这些数组。

我的辅助函数

function parseLogicalExpression(expression) {
  const result = [];
  let currentExpression = '';

  for (let i = 0; i < expression.length; i++) {
    const char = expression[i];
    if (char === '(') {
      if (currentExpression !== '') {
        result.push(currentExpression);
        currentExpression = '';
      }
      let stack = 1;
      let subExpression = '';
      while (stack > 0) {
        i++;
        if (expression[i] === '(') {
          stack++;
        } else if (expression[i] === ')') {
          stack--;
        }
        if (stack > 0) {
          subExpression += expression[i];
        }
      }
      result.push(parseLogicalExpression(subExpression));
    } else if (char === '+' || char === '|') {
      if (currentExpression !== '') {
        result.push(currentExpression);
        currentExpression = '';
      }
      result.push(char);
    } else {
      currentExpression += char;
    }
  }

  if (currentExpression !== '') {
    result.push(currentExpression);
  }

  return result;
}

let expression = "((some+test)|(figure+(10|20))+(circle+figure|(3d)))"; // !!! This expression differs from that in the examples. It has been changed so that it is not too cumbersome

console.log(parseLogicalExpression(expression));
.as-console-wrapper {
  min-height: 100%;
}

内容的提问来源于stack exchange,提问作者CardRoy Ybr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:13:14