如何创建正则表达式验证含逻辑AND/OR运算符及括号的字符串
优化验证逻辑运算符与成对括号表达式的C#正则
嘿,你当前的正则已经抓住了核心需求:确保括号成对匹配,同时让表达式遵循“原子 + (AND/OR + 原子)”的结构,从测试结果来看,合法的表达式能顺利通过,带多余无运算符内容的非法表达式也被正确拦截,这基础逻辑是没问题的。不过咱们可以让它更严谨、更易读一些,下面是优化方案:
优化后的正则表达式
// 带注释的格式(需配合RegexOptions.IgnorePatternWhitespace使用) string validator = @"^ # 第一步:预检查整个字符串的括号是否完全平衡 (?= ^[^()]* (?> [^()]+ # 匹配非括号字符 | \( (?<DEPTH>) # 遇到左括号,深度+1 | \) (?<-DEPTH>) # 遇到右括号,深度-1 )* (?(DEPTH)(?!)) # 如果深度不为0,匹配失败 [^()]*$ ) # 第二步:验证表达式的语法结构 (?: \( (?> [^()]+ | (?R) )* \) # 匹配带括号的子表达式(递归验证内部结构) | [0-9a-zA-Z]+ # 匹配纯字母数字的原子 ) # 匹配后续的AND/OR + 原子结构 (?: \s+ (AND|OR) \s+ (?: \( (?> [^()]+ | (?R) )* \) | [0-9a-zA-Z]+ ) )* $"; // 压缩后的一行版本(无需忽略空白符) string compactValidator = @"^(?=^[^()]*(?>[^()]+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))[^()]*$)(?:\((?>[^()]+|(?R))*\)|[0-9a-zA-Z]+)(?:\s+(AND|OR)\s+(?:\((?>[^()]+|(?R))*\)|[0-9a-zA-Z]+))*$";
核心优化点
- 更精准的原子定义:原正则里的
[(]*[0-9a-zA-Z]+[)]*可能会匹配(abc或abc)这种半括号的非法原子,优化后的正则明确原子只能是完全闭合的括号子表达式或者纯字母数字标识符,杜绝了这种情况。 - 递归验证子表达式:通过
(?R)递归引用整个正则结构,确保括号内部的子表达式也完全符合语法规则,比如嵌套的((a AND b) OR (c AND d))能被正确识别。 - 结构更清晰:把括号平衡检查和语法结构验证拆分开,可读性更强,后续维护也更方便。
测试验证
用你的测试案例验证:
- 合法案例:
(xyz AND abcd)、((abc AND jkr) AND (3 OR 4))→ 正常通过 - 非法案例:
(xyz AND abcd efg)、((abc AND jkr) AND (3 OR 4 abcd))→ 正确拦截 - 新增非法场景:
((abc)、abc)、xyz OR、(a AND (b OR c→ 全部被拒绝
自定义扩展提示
如果你的标识符需要支持下划线、连字符等其他字符,只需把[0-9a-zA-Z]+修改为符合你需求的字符集,比如[0-9a-zA-Z_]+即可。
内容的提问来源于stack exchange,提问作者Brendan Croos
相关产品推荐
相关产品推荐

