我想在 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 OR 2) AND 3 或1 or (2 AND 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 并单击下载解析器
。
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); }
关于javascript - 需要在 Javascript 中创建正则表达式来检查有效的条件字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13208282/