使用LabVIEW实现正则表达式括号合法性校验的问题求助
LabVIEW 数学表达式括号合法性校验实现方案
括号合法性校验无需完全依赖正则表达式实现,直接用栈计数逻辑实现效率更高、边界场景覆盖更全,具体可按以下方案操作:
核心校验逻辑
- 初始化两个计数变量:
左括号计数、右括号计数,初始值均为0 - 逐字符遍历输入的数学表达式:
- 遇到
(时,左括号计数+1 - 遇到
)时,右括号计数+1 - 遍历过程中如果出现右括号计数 > 左括号计数的情况,直接判定非法,输出
False
- 遇到
- 遍历完成后,判断
左括号计数 == 右括号计数,相等则输出True,否则输出False
LabVIEW 具体操作步骤
- 前面板创建两个控件:
- 字符串输入控件,命名为
数学表达式,用于输入待校验内容 - 布尔显示控件,命名为
括号合法性,可自定义亮灭对应合法/非法状态
- 字符串输入控件,命名为
- 程序框图实现:
- 调用
字符串至字节数组转换函数,将输入字符串拆分为单个字符的ASCII码数组 - 用
For循环遍历数组元素,循环内设置两个移位寄存器分别存储左、右括号计数:- 条件结构判断当前字符ASCII码:等于40(对应
()则左计数+1,等于41(对应))则右计数+1,其余字符不修改计数 - 每次计数更新后新增判断:如果右计数 > 左计数,直接给布尔控件赋值
False,同时调用终止循环节点提前结束遍历
- 条件结构判断当前字符ASCII码:等于40(对应
- 循环正常结束后,判断两个计数是否相等,相等则赋值
True,否则赋值False
- 调用
- 边界用例测试验证:
- 空字符串:输出
True (a+b)*(c-d):输出Truea+b):提前终止,输出False((a+b):遍历结束计数不等,输出Falsea+(b*(c-d))+e:输出True
- 空字符串:输出
正则表达式替代方案
如果要复用正则能力实现,可调用LabVIEW内置匹配正则表达式函数,适配混合字符数学表达式的正则规则为^[^()]*(?:(\((?>[^()]+|(?1))*\))[^()]*)*$,匹配成功则返回True,否则返回False。该方案代码量更小,但兼容性和可维护性弱于自定义计数方案,优先推荐用计数法实现。
内容的提问来源于stack exchange,提问作者MichalB
相关产品推荐
相关产品推荐

