2017-02-16 100 views
1

指數正則表達式我有兩個數組:比較和Javascript數組

enteredCommands = ["valid", "this", 1.1]; 
validParameters = [/valid/, /alsoValid/, /this|that/, /\d+(\.)?\d*/]; 

我想遍歷所有enteredCommands的,如果它在validParameters存在從validParameters刪除它,如果它不,休息。

我不知道如何在正則表達式比較以這種方式,如果我改變validParameters到:

validParameters = ["valid", "alsoValid", /this|that/, /\d+(\.)?\d*/];

及用途:

var ok2go = true; 
// For each entered command... 
for (var i = 0; i < commands.length; i++) { 
    // Check to see that it is a valid parameter 
    if (validParameters.indexOf(commands[i]) === -1) { 
     // If not, an invalid command was entered. 
     ok2go = false; 
     break; 
    // If valid, remove from list of valid parameters so as to prevent duplicates. 
    } else { 
     validParameters.splice(validParameters.indexOf(commands[i]), 1); 
    } 
    return ok2go; 
} 

if (ok2go) { 
    // do stuff if all the commands are valid 
} else { 
    alert("Invalid command"); 
} 

它的工作原理我想要的方式爲字符串,但顯然不是那些需要正則表達式的值。有什麼辦法可以解決這個問題嗎?

測試用例:

enteredCommands = ["valid", "this", 1.1, 3]; 
// Expected Result: ok2go = false because 2 digits were entered 

enteredCommands = ["valid", "alsoValid", "x"]; 
// Expected Result: ok2go = false because x was entered 

enteredCommands = ["valid", "alsoValid", 1]; 
// Expected Result: ok2go = true because no invalid commands were found so we can continue on with the rest of the code 
+0

請添加想要的結果。 –

+1

完全不清楚你要求或想要完成的內容 – charlietfl

+0

想要的結果只是驗證所有'enteredCommands'只在'validParameters'中存在一次。因此:「我想遍歷所有'enteredCommands',如果它存在於'validParameters'中,則將其從'validParameters'中移除,如果它不存在,則中斷。」 – mariahm24

回答

2

您可以過濾給定的命令,如果正則表達式匹配時,從正則表達式陣列排除。只返回與正則表達式數組其餘部分不匹配的逗號。

function check(array) { 
 
    var regex = [/valid/, /alsoValid/, /this|that/, /\d+(\.)?\d*/]; 
 

 
    return array.filter(function (a) { 
 
     var invalid = true; 
 
     regex = regex.filter(function (r) { 
 
      if (!r.test(a)) { 
 
       return true; 
 
      } 
 
      invalid = false; \t \t \t \t \t 
 
     }); 
 
     invalid && alert('invalid command: ' + a); 
 
     return invalid; 
 
    }); 
 
} 
 

 
console.log(check(["valid", "this", 1.1, 3])); // 2 digits were entered 
 
console.log(check(["valid", "alsoValid", "x"])); // x was entered 
 
console.log(check(["valid", "alsoValid", 1])); // nothing, no invalid commands were found

+0

如果'enteredCommands'包含諸如'「x」'之類的東西,則不會解決這個問題,在這種情況下,我想提醒您輸入了無效的命令。 – mariahm24

+0

請給這個問題添加一些測試用例,以及會發生什麼。實際上,如果輸入了無效的命令,這個答案會事先檢查'enteredCommands'。 –

+0

增加了測試用例,其目標不一定是從'validParameters'中移除事物,它只是在執行該函數的其餘部分之前執行語法檢查。 – mariahm24

0

我建議你分手了支票的正則表達式匹配以及匹配的字符串檢查。

從概念上講,你可能想要做以下(代碼未測試)

var validStringParameters = ["valid", "alsoValid"]; 
var validRegexMatches = [/valid/, /alsoValid/, /this|that/, /\d+(\.)?\d*/]; 

var validCommands = enteredcommands.filter(function(command){ 
if (validStringParameters.indexOf(command) !== -1){ 
return true; 
} 
for (var i = 0; i < validRegexMatches.length; i++){ 
if (command.test(validRegexMatches[i]){ 
return true; 
}) 
return false; 
} 
})