Javascript正则表达式问题

时间:2010-03-16 17:13:31

标签: javascript regex

我正在创建一个小的Yahtzee游戏,我遇到了一些正则表达式问题。我需要验证某些标准,看看它们是否符合要求。一到六个字段非常直接,问题出现之后。就像尝试创建一个匹配梯子的正则表达式一样。直线应包含以下字符1-5之一。它必须包含其中一个通过,但我无法弄清楚如何检查它。我在想/1{1}2{1}3{1}4{1}5{1}/g;,但只有在它们按顺序排列时才匹配。如何检查它们是否按正确顺序排列?

6 个答案:

答案 0 :(得分:3)

如果我理解你的话,你想检查一个字符串是否包含随机顺序中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$/);

答案 1 :(得分:2)

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

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 rules

答案 2 :(得分:1)

为了简单和容易,我会选择indexOf。

string.indexOf(searchstring, start)

像Max一样循环1到5,但只检查indexOf i,突然出现任何错误。

这也将对小直线有所帮助,其中只有4个中的4个(12345或23456)。 编辑:Woops。 1234,2345,356。抱歉。

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

答案 3 :(得分:1)

"12543".split('').sort().join('') == '12345'

答案 4 :(得分:1)

使用正则表达式:

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

(不是建议......)

答案 5 :(得分:1)

regexp可能不是解决此问题的最佳解决方案,但为了好玩:

/^(?=.*1)(?=.*2)(?=.*3)(?=.*4)(?=.*5).{5}$/.test("12354")

匹配每个包含五个字符的字符串,即数字1-5,每个字符串中的一个。

(?=.*1)是一个积极的前瞻,基本上是说“在这里的正确位置,应该有一个或任何一个跟随1”。

Lookaheads不会“消耗”正则表达式的任何部分,因此每个数字检查都从字符串的开头开始。

然后有.{5}实际消耗五个字符,以确保它们的数量正确。