2014-04-18 2 views
4

포커를하는 동안 손에 들고있는 것을 알아내는 코드를 작성하려고합니다. 제가 만들고있는 패턴 객체는 5 장의 카드를 확인하는 형식입니다. 각 카드는 값에 의해 정의 된 다음 양복으로 정의됩니다. 예를 들어 스페이드의 에이스는 As로 표시됩니다. 직선을 인식하려면 다음과 같은 코드가 있지만 순서가 맞으면 작동합니다. 어떻게하면 똑같은 문자열을 5d4sAc3s2h과 같이 인식하게 할 수 있을까요? 어떤 도움을 주셔서 감사합니다!정규식이 어떤 순서로든 매치합니다.

Pattern[] floppedStraightCheck; 
floppedStraightCheck = new Pattern[10]; 
floppedStraightCheck[0] = Pattern.compile("(([aA][scdhSCDH])([2][scdhSCDH])([3][scdhSCDH])([4][scdhSCDH])([5][scdhSCDH])"); 
+2

정직하게 말하면이 문제에 대한 최선의 해결책은 정규 표현식처럼 들리지 않습니다. 문자열을 먼저 구문 분석하면 (정규식은 도움이 될지 모르지만 정규식을 사용하지 않고도 충분히 간단해야합니다) 'CardInfo' 객체 (또는 이와 유사한)의 배열을 만든 다음 해당 배열을 분석하여 스트레이트 풀 하우스인지 확인하고, –

+1

예, 문자열이 손을 표현하는 가장 좋은 방법은 아님 –

+1

핵심 응용 프로그램 논리를 하나의 정규식에 넣으려고하는 것처럼 들립니다. 대신에 훨씬 더 읽고 유지 보수 할 수있는 메소드를 작성해야합니다. –

답변

1

정규식에는별로 좋은 작업이 아닙니다. 여러 개의 and 조건이 있으며 이에 대해 긍정적 인 미리보기를 사용할 수 있습니다.

^(?=.*[aA][scdhSCDH])(?=.*2[scdhSCDH])(?=.*3[scdhSCDH])(?=.*4[scdhSCDH])(?=.*5[scdhSCDH]).{10}$ 

Regular expression visualization

Debuggex Demo

짧은 버전은 다음과 같습니다

^(?=(..)*[aA])(?=(..)*2)(?=(..)*3)(?=(..)*4)(?=(..)*5)(.[scdhSCDH]){5}$ 

Regular expression visualization

Debuggex Demo

,
2

위의 의견에 정확하게 동의해야합니다. 나는 이것이 regular expression이 이것을 구성하는 적절한 방법이라고 생각하지 않는다. 나는 또한 당신이 문자열이 아닌 손의 다른 접근 방식을 사용하는 것이 좋습니다. 이 경우 정규식에 대해 배울 수있는 중요한 것은 not을 사용하는 것입니다.

관련 문제