2010-03-16 2 views
0

Я создаю маленькую игру Yahtzee, и я столкнулся с некоторыми проблемами с регулярным выражением. Мне нужно проверить определенные критерии, чтобы убедиться, что они выполнены. Поля с одного до шести очень прямолинейны, проблема возникает после этого. Подобно попытке создать регулярное выражение, которое соответствует лестнице. Строка должна содержать один из следующих символов 1-5. Он должен содержать один из каждого, чтобы пройти, но я не могу понять, как его проверить. Я думал /1{1}2{1}3{1}4{1}5{1}/g;, но это соответствует только если они приходят в порядок. Как я могу проверить, не пришли ли они в правильном порядке?Проблема с регулярными выражениями Javascript

+1

Можете ли вы привести несколько примеров ввода и ожидаемого вывода? – Gumbo

+0

Закажите их до этого? Но, честно говоря, вы не должны пытаться определить рулон с регулярным выражением, я думаю. – Joey

+0

Да, сначала сортировка «кости» облегчит оценку результата независимо от того, что вы используете, используете ли вы регулярное выражение в качестве следующего шага или нет. Если вы * do * ходите с регулярными выражениями, не используйте '{1}'; вы просто загромождаете регулярное выражение, в то время как вы говорите ему делать то, что он собирается делать в любом случае. ;) –

ответ

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

Для простоты и легкости, я бы с IndexOf.

string.indexOf(searchstring, start) 

Петля от 1 до 5, как Макс, но просто проверьте indexOf i, вырвется для любого ложного.

Это также поможет для маленькой прямой, которая только 4 из 5 в порядке (12345 или 23456). Редактировать: Woops. 1234, 2345, 3456. Извините.

Возможно, у вас даже есть общая функция для проверки на наличие прямых длины, проходящих в максимальном индексе цикла, а также в строке проверки.

1
"12543".split('').sort().join('') == '12345' 
+0

Просто заметил, что это тот же ответ, что и Макс Шавабке. Я голосую за него. –

+0

ábio: Хорошее решение. Патрик мог сортировать все входы, прежде чем запускать регулярные выражения, что значительно облегчает их запись. –

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

1

С регулярным выражением:

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

(Не то, что рекомендуется ...)

+1

+1)) Я люблю код klngon. majQa '! – user187291

1

Регулярное выражение, вероятно, не лучший решение для этой проблемы, но для развлечения:

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

Это соответствует каждой строке, содержащей ровно пять символов, которые являются номерами 1-5, по одному из них.

(?=.*1) является положительным взглядом, по существу говоря «по праву отсюда должно быть что угодно или ничего не следует 1».

Lookaheads не «потребляют» любую часть регулярного выражения, поэтому каждая проверка номера начинается с начала строки.

Тогда есть .{5}, чтобы фактически использовать пять символов, чтобы убедиться, что их правильное количество.

Смежные вопросы