Javascript正则表达式问题

Javascript正则表达式问题,javascript,regex,Javascript,Regex,我正在创建一个小Yahtzee游戏,我遇到了一些正则表达式问题。我需要验证某些标准,看看它们是否满足。第1到第6个字段非常简单,问题就在后面。就像试图创建一个与梯形图匹配的正则表达式。直线应包含以下字符之一1-5。它必须包含每一个通过,但我不知道如何检查它。我在想/1{1}2{1}3{1}4{1}5{1}/g但只有在它们按顺序排列时才匹配。如何检查它们的顺序是否正确?如果我理解正确,您需要检查字符串是否包含随机顺序为1到5的数字。如果正确,则可以使用: var s = '25143'; var

我正在创建一个小Yahtzee游戏,我遇到了一些正则表达式问题。我需要验证某些标准,看看它们是否满足。第1到第6个字段非常简单,问题就在后面。就像试图创建一个与梯形图匹配的正则表达式。直线应包含以下字符之一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;
}

为了简单易用,我选择indexOf

string.indexOf(searchstring, start)
像Max一样循环1到5,但只需检查indexOf i,就可以跳出任何false

这也将有助于小直道,这是5个顺序中只有4个(12345或23456)。 编辑:Woops。1234, 2345, 3456. 对不起


您甚至可以使用一个通用函数来检查任意长度的直线,传递最大循环索引以及要检查的字符串

虽然这肯定可以用正则表达式来解决,但我发现提供一个基于简单算术的“纯”解决方案是非常有趣和有教育意义的。事情是这样的:

"12543".split('').sort().join('') == '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(comb){
if(comb.length!=5)返回null;
VarMap=[0,0,0,0,0,0];
对于(变量i=0;i6)返回null;
地图[数字-1]++;
}
var和=0,p=0,seq=0;
对于(变量i=0;i=3)和+=map[i];
p=map[i]?p+1:0;
如果(p>seq)seq=p;
}
如果(总和=5)返回“Yahtzee”;
如果(总和=23)返回“满座”;
如果(总和=3)返回“三类”;
如果(总和=4)返回“四类”;
如果(seq==5)返回“大直”;
如果(seq==4)返回“小直”;
返回“机会”;
}
作为参考,带有regex的

return /^([1-5])(?!\1)([1-5])(?!\1|\2)([1-5])(?!\1|\2|\3)([1-5])(?!\1|\2|\3|\4)[1-5]$/.test("15243");

(不建议使用…)

regexp可能不是解决此问题的最佳解决方案,但出于乐趣:

/^(?=.*1)(?=.*2)(?=.*3)(?=.*4)(?=.*5).{5}$/.test("12354")
它匹配每个正好包含五个字符的字符串,即数字1-5,每个字符中有一个

(?=.*1)
是一个积极的前瞻,本质上是说“在这里的最右边,应该有任何东西或没有任何东西跟在1后面”

Lookaheads不会“使用”regexp的任何部分,因此每个数字检查都从字符串的开头开始


然后还有
{5}
来实际使用这五个字符,以确保它们的数量正确。

您能给出一些输入和预期输出的示例吗?请在这之前对它们进行排序?但老实说,我认为你不应该尝试用正则表达式来确定掷骰结果。是的,首先对“骰子”进行排序将使评估结果变得更容易,无论结果是什么,无论你是否将正则表达式用作下一步。如果您使用正则表达式,请不要使用
{1}
;你只是把正则表达式弄得乱七八糟,而你却告诉它无论如何都要做什么我注意到这和Max Shawabkeh的答案是一样的。我投票支持他。亚比奥:很好的解决方案。Patrick可以在运行正则表达式之前对所有输入进行排序,从而使它们更易于编写。
/^(?=.*1)(?=.*2)(?=.*3)(?=.*4)(?=.*5).{5}$/.test("12354")