簡體   English   中英

JavaScript正則表達式問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM