2015-02-05 3 views
0

Я делаю проект кодирования для базовой нерекурсивной, не GUI-формы Minesweeper. Одним из требований является то, что входные команды должны быть строго отформатирован следующим образом:Как проверить форматированный вход?

Для маркировки команд (раскрыть, догадаться, марка): [ "показать"/"г"] [INT] [Int]

Для справки и выхода: только ["help"/"h"] или ["quit"/"q"]

Любые входные данные за пределами этих ограничений должны считаться неформатированными. Мой код для показа выглядит примерно так:

case "reveal": 
case "r": 
    roundsCompleted ++; 
    if(input.hasNextInt()){ 
     par1 = input.nextInt(); 
    } 
    else{ 
     commandIn = null; 
    } 
    if(input.hasNextInt()){ 
     par2 = input.nextInt(); 
     correctInput = true; 
    } 
    else{ 
     commandIn = null; 
    } 


    if(correctInput && isInBounds(par1, par2)){ 
     reveal(par1, par2); 

где все это внутри оператора коммутатора, конечно. Операторы commandIn = null предназначены для создания случая по умолчанию, который печатает «команда не распознана». Я понимаю, что часть моей проблемы здесь состоит в том, что они находятся в двух отдельных операторах if-else. Другая проблема заключается в том, что input.hasNextInt(), по-видимому, не оценивает значение false, когда после первого нет int.

Суть этой проблемы заключается в полном ограничении этих команд форматами, перечисленными выше. Может ли кто-нибудь дать мне некоторое представление об этой проблеме? Благодарю.

+0

Или вы могли бы избежать необходимости в 'hasNextInt' от используя регулярное выражение? Что-то вроде '/^[a-z] + \ d {2} $ /'? Извиняюсь, если это неправильно, мое регулярное выражение ржавое. –

ответ

1

Я хотел бы использовать regex сначала увидеть, если что-то либо хороший вход или не только причиной, было бы проще

String input = "r 3 4"; 
    if (input.matches("^(help|h|quit|q|((r|reveal) \\d \\d))$")) 
     //switch case 
     System.out.println("match"); 

    else 
     //null string 
     System.out.println("no match"); 

то после того, как у вас есть матч, вы можете использовать свой кожух переключателя, как что вы делаете, если это «раскрыть» или «r», я бы просто использовал split() и превратил его в массив, чтобы получить разные координаты x и y.

+0

Ничего себе, я не знал, что вы можете это сделать. Я новичок в regex, я пытался реализовать чисто Java-решение, но это намного лучше, спасибо. – user3522016

+0

в любое время, удача звучит как классный проект. Я использовал http://rubular.com/, чтобы быстро проверить, какие входы будут соответствовать регулярному выражению, это может быть полезно. – drop27