2017-03-01 15 views
0

ブラケット付きのブール式を含むJavaScriptの文字列を検証したいと思います。この文字列に含まれる数字は1-9,(),OR,ANDです。良い文字列のブール式をjavascriptの正規表現で括弧で飾る

例:

"1と2"

"2 OR 4"

"4 AND(3 OR 5)"

私は正規表現がこのタスクに十分柔軟であるかどうかはわかりません。これをjavascriptで実現する素敵な方法がありますか?

+0

.NETの正規表現は非常に強力ですが、あまりにも、バランスのとれた構造を一致させることができます。何を試しましたか?なぜあなたはC#でそれを書いているが、JSタグで質問をタグ付けしたと言うのですか? –

+0

タイトルはJavaScriptで書かれており、コンテンツはC#で書かれています。 –

+0

申し訳ありませんが、質問の内容を編集しました – Tommy1209

答えて

0

JavaScriptでは、以下を使用できます。
'AND/OR/NOT'を '& &/|| /!'に置き換えます。
evalを使用して評価してください。

慎重な(JSの正規表現は、ネストされた括弧を扱うことができないので)だけでは正規表現は、このタスクのために十分に強力ではありませんが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)); 
 
}

+0

OPは_evaluate_ではなく、_validate_と言っています。式が無効な場合、これはエラーをスローすると思います。 –

+0

@Rawingの質問には多くの間違いがあり、私はOPを評価したいと考えています。私は問題のコメントを追加し、それに応じて行動を起こします。それについて私に気づいてくれてありがとう。 –

0

強力な機能ですので、それは簡単ですJavascriptからの少しの助けを借りてタスク。

ネストされた中カッコを扱うことはできないので、カッコは一度に1つずつ処理されます。 (?:^ *)?(?:\(*|())[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. 
+0

私はhttps://regex101.com/r/jgx2Qc/1であなたの模様を試しましたが、十分ではありません。少なくとも論理式が必要です:4 AND(3 OR 5)AND(1 OR 6)以上 – Tommy1209

+0

@ Tommy1209正規表現のバグを修正しました。私の答えの中のコードを無視しないでください。 '4 AND(3 OR 5)AND(1 OR 6)'を有効にします。 –

関連する問題