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