我想驗證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