[英]Javascript regular expressions problem
我正在創建一個小型Yahtzee游戲,但遇到了一些正則表達式問題。 我需要驗證某些條件,看看是否符合要求。 問題一到六非常直接,問題出在那之后。 就像嘗試創建與階梯匹配的正則表達式。 直線應包含以下字符1-5之一。 它必須包含每個要通過的內容,但我不知道如何進行檢查。 我以為/1{1}2{1}3{1}4{1}5{1}/g;
但這僅在順序排列時匹配。 我如何檢查它們的排列順序不正確?
如果我沒看錯,您想檢查一個字符串是否以隨機順序包含從1到5的數字。 如果正確,則可以使用:
var s = '25143';
var valid = s.match(/^[1-5]{5}$/);
for (var i=1; i<=5; i++) {
if (!s.match(i.toString())) valid = false;
}
要么:
var s = '25143';
var valid = s.split('').sort().join('').match(/^12345$/);
盡管使用正則表達式絕對可以解決此問題,但我發現基於簡單的算術提供“純”解決方案非常有趣並且很有教育意義。 它是這樣的:
function yahtzee(comb) {
if(comb.length != 5) return null;
var map = [0, 0, 0, 0, 0, 0];
for(var i = 0; i < comb.length; i++) {
var digit = comb.charCodeAt(i) - 48;
if(digit < 1 || digit > 6) return null;
map[digit - 1]++;
}
var sum = 0, p = 0, seq = 0;
for(var i = 0; i < map.length; i++) {
if(map[i] == 2) sum += 20;
if(map[i] >= 3) sum += map[i];
p = map[i] ? p + 1 : 0;
if(p > seq) seq = p;
}
if(sum == 5) return "Yahtzee";
if(sum == 23) return "Full House";
if(sum == 3) return "Three-Of-A-Kind";
if(sum == 4) return "Four-Of-A-Kind";
if(seq == 5) return "Large Straight";
if(seq == 4) return "Small Straight";
return "Chance";
}
供參考, Yahtzee規則
為了簡便起見,我將使用indexOf。
string.indexOf(searchstring, start)
像Max一樣循環1到5,但只需檢查indexOf i,請檢查是否有錯誤。
這對於小順子也有幫助,小順子在順序中只有5分之4(12345或23456)。 編輯:糟糕。 1234、2345、3456。對不起。
您甚至可以使用通用函數來檢查任意長度的直線,並傳入最大循環索引以及要檢查的字符串。
"12543".split('').sort().join('') == '12345'
使用正則表達式:
return /^([1-5])(?!\1)([1-5])(?!\1|\2)([1-5])(?!\1|\2|\3)([1-5])(?!\1|\2|\3|\4)[1-5]$/.test("15243");
(不建議這樣做...)
正則表達式可能不是解決此問題的最佳方法,但很有趣:
/^(?=.*1)(?=.*2)(?=.*3)(?=.*4)(?=.*5).{5}$/.test("12354")
它將匹配每個包含正好五個字符(即1-5)的字符串,每個字符串之一。
(?=.*1)
是一個積極的前瞻,本質上是說“在此處的最右邊,應該有任何東西或無,后跟1”。
先行者不會“消耗”正則表達式的任何部分,因此每次數字檢查都從字符串的開頭開始。
然后是.{5}
以實際使用這五個字符,以確保它們的數量正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.