我想在
javascript中创建正则表达式,它将检查有效的条件字符串,如
-1 OR (1 AND 2) AND 1 -1 OR (1 AND 2) -1 OR 2 -1 OR 1 OR 1 -1 AND 1 AND 1
该字符串不应包含“AND”和“OR”.
例如 – 1 OR 2 AND 3无效.
– 它应该是(1或2)和3或1或(2和3).
我尝试了以下正则表达式.它适用于大多数情况,但未能检查上述情况.
/^(\s*\(\d+\s(AND|OR)\s\d+\)|\s*\d+)((\s*(AND|OR)\s*)(\(\d+\s(AND|OR)\s\d+\)|\s*\d+))*$/
任何人都可以帮我解决上述问题.
解决方法
忘记正则表达式,他们不能这样做.
解析器发电机来救援
使用解析器生成器,您可以创建既可理解又可维护的语法.
这是一个parser generator的JavaScript与在线演示.
语法
根据我的理解,您不希望AND和OR之间存在任何隐含的优先级规则.
以下是它认为有效的示例:
-1 OR 2 OR (2 AND 2 AND (2 OR (6 AND -2 AND (6 OR 2) AND (6 OR 2)) OR 2 OR 2))
目前,语法需要/支持
>“无限”筑巢
>显式优先级控制,括号为AND / OR
>(多重)否定文字
>操作数和运算符之间的空格
语法很容易改为
>允许任意空格
>可选的否定文字而不是可能的多重否定
>否定任何子表达式
如果您想要更深入的解释或无法弄清楚如何根据自己的喜好进行调整,只需发表评论即可.
这是你的语法,只需将其粘贴到online generator并单击Download parser即可.
start
= formula
formula
= ors
/ ands
/ literal
/ parens_formula
parens_formula
= "(" formula ")"
ors
= operand (whitespace "OR" whitespace operand)+
ands
= operand (whitespace "AND" whitespace operand)+
whitespace
= " "+
operand
= literal
/ parens_formula
literal
= integer
/ "-" literal
integer "integer"
= digits:[0-9]+ { return parseInt(digits.join(""),10); }