我想验证JavaScript中包含带括号的布尔表达式的字符串。该字符串应该只包含数字1-9
,()
,OR
, AND
。好的串使用括号在javascript正则表达式中验证布尔表达式
实例:
“1和2”
“2 OR 4”
“4和(3 OR 5)”
我不确定正则表达式是否足够灵活用于此任务。有没有一个很好的简短的方法来实现这个在JavaScript?
我想验证JavaScript中包含带括号的布尔表达式的字符串。该字符串应该只包含数字1-9
,()
,OR
, AND
。好的串使用括号在javascript正则表达式中验证布尔表达式
实例:
“1和2”
“2 OR 4”
“4和(3 OR 5)”
我不确定正则表达式是否足够灵活用于此任务。有没有一个很好的简短的方法来实现这个在JavaScript?
在JavaScript中,您可以使用以下方法。
将'AND/OR/NOT'替换为'& &/|| /!'。
使用eval
来评估它。
小心,因为EVAL是一个功能强大
var string = "0 AND 2";
var string1 = "0 OR 2";
var string2 = "NOT 0";
evaluate(string);
evaluate(string1);
evaluate(string2);
function evaluate(string){
string=string.replace(/AND/g,'&&');
string=string.replace(/OR/g,'||');
string=string.replace(/NOT/g,'!');
console.log(eval(string));
}
OP表示_validate_,而不是_evaluate_。虽然我猜如果表达式无效,这会引发错误。 –
@认真思考这个问题有很多错误,我假设OP要评估。我添加了一个有问题的评论,并会采取相应的措施。感谢您注意到这一点。 –
虽然单正则表达式是不是这个任务足够强大(因为JS正则表达式不能处理嵌套的括号),这是一个简单任务与Javascript的一点帮助。
由于我们无法处理嵌套花括号,因此我们将一次处理一个花括号,直到没有花括号。模式(?:^ *)?(?:\(*|())[1-9](?: +(?:AND|OR) +[1-9])?(?: *\)|\1)
将匹配表格X AND/OR Y
和周围的大括号(如果有的话)。我们用1
(或您的布尔语言中的任何其他有效表达式)替换此模式的所有出现,直到模式不再匹配。
function validate(expression){
var pattern= /(?:^ *)?(?:\(*|())[1-9](?: +(?:AND|OR) +[1-9])?(?: *\)|\1)/g;
while(true){
var replaced= expression.replace(pattern, "1");
// if the expression has been reduced to "1", it's valid
if(replaced=="1") return true;
// if the pattern didn't match, it's invalid
if(replaced==expression) return false;
expression= replaced;
}
}
模式说明:
(?:^ *)? // if at the start of the string, consume any spaces
(?:\(*|()) // match either "(" or nothing. The empty capture group will be used later.
[1-9] // match the first digit
(?: // if possible, match...
+(?:AND|OR) + // "AND" or "OR" surrounded by spaces
[1-9] // and a digit
)?
(?: *\)|\1) // match ")", or, if there was no opening "(", the empty string.
我在https://regex101.com/r/jgx2Qc/1尝试了你的partern,但还不够。我至少需要逻辑表达式:4和(3或5)和(1或6)或更多 – Tommy1209
@ Tommy1209修复了正则表达式中的错误。请不要忽略我答案中的代码。它验证'4 AND(3或5)AND(1 or 6)'就好了。 –
.NET正则表达式是非常强大,可以搭配均衡的结构了。你有什么尝试?你为什么说你用C#编写它,但用JS标签标记问题? –
标题在JavaScript中表示,内容在C#中表示。 –
对不起,我编辑了问题 – Tommy1209