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

如何在JavaScript中验证含嵌套括号的合法字符串并转换为JSON

解决方案:带嵌套函数的字符串验证与JSON转换

核心思路:递归解析+栈校验

字符拆分法无法处理嵌套括号的层级关系,必须用栈结构做括号合法性校验,配合递归解析函数结构来处理多层嵌套逻辑。

一、合法性判定示例

合法字符串

  • AND(TRUE, FALSE, SUM(1,2,3)>5)
  • OR(SUM(MAX(4,6), MIN(2,3)), 10>20, AND(TRUE, FALSE))
  • SUM(1, 2, AVG(3,4,5), 6)

非法字符串

  • AND(TRUE, FALSE (括号未闭合)
  • OR(, TRUE) (存在空占位参数)
  • SUM(1, 2) 3 (函数后附带无意义字符)
  • INVALID_FUNC(1,2) (使用未定义函数,若有函数白名单则判定非法)

二、实现步骤

1. 括号合法性校验

用栈跟踪括号的匹配状态,确保嵌套结构正确:

def validate_parentheses(s):
    stack = []
    for c in s:
        if c == '(':
            stack.append(c)
        elif c == ')':
            if not stack:
                return False
            stack.pop()
    return len(stack) == 0

2. 递归解析函数结构

将合法字符串转换为指定JSON结构,以下是预期结构示例(以AND(TRUE, SUM(1,2)>3)为例):

{
  "type": "function",
  "name": "AND",
  "arguments": [
    {"type": "literal", "value": true},
    {
      "type": "comparison",
      "operator": ">",
      "left": {
        "type": "function",
        "name": "SUM",
        "arguments": [
          {"type": "literal", "value": 1},
          {"type": "literal", "value": 2}
        ]
      },
      "right": {"type": "literal", "value": 3}
    }
  ]
}

核心解析代码片段:

import re
from typing import Dict, List, Union

def parse_expression(s: str) -> Union[Dict, None]:
    s = s.strip()
    # 匹配函数格式:函数名(参数列表)
    func_match = re.match(r'^([A-Z_]+)\((.*)\)$', s)
    if func_match:
        func_name = func_match.group(1)
        args_str = func_match.group(2)
        args = split_args(args_str)
        return {
            "type": "function",
            "name": func_name,
            "arguments": [parse_expression(arg) for arg in args]
        }
    # 匹配比较表达式
    comp_match = re.match(r'^(.*?)([<>!=]=?)(.*)$', s)
    if comp_match:
        left = comp_match.group(1).strip()
        op = comp_match.group(2)
        right = comp_match.group(3).strip()
        return {
            "type": "comparison",
            "operator": op,
            "left": parse_expression(left),
            "right": parse_expression(right)
        }
    # 匹配字面量(布尔、数字)
    if s == 'TRUE':
        return {"type": "literal", "value": True}
    if s == 'FALSE':
        return {"type": "literal", "value": False}
    if s.replace('.', '', 1).isdigit():
        return {"type": "literal", "value": float(s) if '.' in s else int(s)}
    # 非法表达式返回None
    return None

def split_args(args_str: str) -> List[str]:
    """拆分函数参数,处理嵌套括号"""
    args = []
    current = []
    bracket_count = 0
    for c in args_str:
        if c == ',' and bracket_count == 0:
            args.append(''.join(current).strip())
            current = []
        else:
            if c == '(':
                bracket_count +=1
            elif c == ')':
                bracket_count -=1
            current.append(c)
    if current:
        args.append(''.join(current).strip())
    return args

3. 完整验证与转换流程

def process_expression(s: str) -> Union[Dict, str]:
    # 先校验括号合法性
    if not validate_parentheses(s):
        return "非法:括号不匹配"
    # 解析表达式
    result = parse_expression(s)
    if not result:
        return "非法:表达式格式错误"
    return result

# 测试示例
print(process_expression("AND(TRUE, SUM(1,2)>3)"))

三、关键扩展点

  • 函数名大小写兼容:可在匹配函数名时统一转换为大写/小写,忽略大小写差异
  • 字符串字面量支持:添加对带引号字符串的匹配逻辑,扩展字面量类型
  • 函数白名单校验:在解析函数时加入白名单判断,仅允许指定函数调用

内容的提问来源于stack exchange,提问作者Prashanth Damam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:10:24