Я создаю маленькую игру Yahtzee, и я столкнулся с некоторыми проблемами с регулярным выражением. Мне нужно проверить определенные критерии, чтобы убедиться, что они выполнены. Поля с одного до шести очень прямолинейны, проблема возникает после этого. Подобно попытке создать регулярное выражение, которое соответствует лестнице. Строка должна содержать один из следующих символов 1-5. Он должен содержать один из каждого, чтобы пройти, но я не могу понять, как его проверить. Я думал /1{1}2{1}3{1}4{1}5{1}/g;
, но это соответствует только если они приходят в порядок. Как я могу проверить, не пришли ли они в правильном порядке?Проблема с регулярными выражениями Javascript
ответ
Если я правильно понял, вы хотите проверить, содержит ли строка цифры от 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$/);
Для простоты и легкости, я бы с IndexOf.
string.indexOf(searchstring, start)
Петля от 1 до 5, как Макс, но просто проверьте indexOf i, вырвется для любого ложного.
Это также поможет для маленькой прямой, которая только 4 из 5 в порядке (12345 или 23456). Редактировать: Woops. 1234, 2345, 3456. Извините.
Возможно, у вас даже есть общая функция для проверки на наличие прямых длины, проходящих в максимальном индексе цикла, а также в строке проверки.
"12543".split('').sort().join('') == '12345'
Просто заметил, что это тот же ответ, что и Макс Шавабке. Я голосую за него. –
ábio: Хорошее решение. Патрик мог сортировать все входы, прежде чем запускать регулярные выражения, что значительно облегчает их запись. –
Хотя это, безусловно, может быть решена с помощью регулярных выражений, я нахожу это весьма интересным и воспитательная обеспечить «чистое» решение, основанное на простых арифметических. Это выглядит следующим образом:
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
С регулярным выражением:
return /^([1-5])(?!\1)([1-5])(?!\1|\2)([1-5])(?!\1|\2|\3)([1-5])(?!\1|\2|\3|\4)[1-5]$/.test("15243");
(Не то, что рекомендуется ...)
+1)) Я люблю код klngon. majQa '! – user187291
Регулярное выражение, вероятно, не лучший решение для этой проблемы, но для развлечения:
/^(?=.*1)(?=.*2)(?=.*3)(?=.*4)(?=.*5).{5}$/.test("12354")
Это соответствует каждой строке, содержащей ровно пять символов, которые являются номерами 1-5, по одному из них.
(?=.*1)
является положительным взглядом, по существу говоря «по праву отсюда должно быть что угодно или ничего не следует 1».
Lookaheads не «потребляют» любую часть регулярного выражения, поэтому каждая проверка номера начинается с начала строки.
Тогда есть .{5}
, чтобы фактически использовать пять символов, чтобы убедиться, что их правильное количество.
- 1. Проблема с регулярными выражениями
- 2. проблема с регулярными выражениями PHP
- 3. Проблема с регулярными выражениями ActionScript
- 4. Проблема с Django URL с регулярными выражениями
- 5. Проблема с пробелом с регулярными выражениями Ruby
- 6. Проблема с регулярными выражениями в python
- 7. Помогите с регулярными выражениями
- 8. трудность с регулярными выражениями
- 9. Проверка с регулярными выражениями
- 10. Сбои с регулярными выражениями
- 11. матч с регулярными выражениями
- 12. Правила с регулярными выражениями
- 13. начиная с регулярными выражениями
- 14. Проблемы с регулярными выражениями
- 15. Синтаксические с регулярными выражениями
- 16. Арифметика с регулярными выражениями
- 17. help с регулярными выражениями
- 18. Рекурсивный соответствие с регулярными выражениями в JavaScript
- 19. Strip с регулярными выражениями .exec Javascript
- 20. Javascript String.replace с динамическими регулярными выражениями?
- 21. Анализ даты с регулярными выражениями в JavaScript
- 22. Проблемы с JavaScript и регулярными выражениями
- 23. Объем Grep с регулярными выражениями
- 24. Sublime Bug с регулярными выражениями
- 25. SQL-обновление с регулярными выражениями
- 26. Борьба с условными регулярными выражениями
- 27. Разбор текста с регулярными выражениями
- 28. Инвертировать совпадение с регулярными выражениями
- 29. PHP скрипт с регулярными выражениями
- 30. Выбирайте слова с регулярными выражениями
Можете ли вы привести несколько примеров ввода и ожидаемого вывода? – Gumbo
Закажите их до этого? Но, честно говоря, вы не должны пытаться определить рулон с регулярным выражением, я думаю. – Joey
Да, сначала сортировка «кости» облегчит оценку результата независимо от того, что вы используете, используете ли вы регулярное выражение в качестве следующего шага или нет. Если вы * do * ходите с регулярными выражениями, не используйте '{1}'; вы просто загромождаете регулярное выражение, в то время как вы говорите ему делать то, что он собирается делать в любом случае. ;) –