2017-01-11 10 views
2

正規表現の新人はこちらpokerhand(Java)と一致する正規表現

特定のポーカーハンドに一致する正規表現が必要です(フルハウス - 1つのランクのカード3枚と別のランクの2枚のカードを含むポーカーハンド)それは任意の順序でカードを備えたフルハウスとして認識する必要があります。すべてのカードのランク(23456789TJQKA)とスーツ(SHDC)

と私がいなくても必ず正規表現は、このための適切なツールですよ、あなたは私が何か他のもの:)

例をやるべきだと思うのであれば教えてください文字列は次のようになります

"KD KC AH AC AD"

私はこの醜い正規表現

(?=.*(([2-9TJQKA])[SHDC]).*\2[SHDC].*\2[SHDC])(?=.*(?!\2)(([2-9TJQKA])[SHDC]).*\4[SHDC].*\4[SHDC]).* 

を作ってみた

(ダイヤモンドの王、クラブの王、ハートのエース、クラブのエース、 ダイヤのエース)

それ仕事をしていないようです。

+0

どのような文字列を取得しますか?そして何を得る必要がありますか? –

+4

私は正規表現でそれをしません、手が2つの異なるランクだけを保持し、ランクの1つが正確に3回を示しているかどうかをチェックする簡単なメソッドを書くことができます。これは、書いて維持する簡単な方法でなければならないし、正規表現を使用していないため、ボーナスとしてより良いパフォーマンスを得ることができます。 – alfasin

+0

文字列クラスのmatches()メソッドと文字列をマッチさせ、regexr.comによれば何も一致しません –

答えて

2

これは「完全な家」に一致する必要があります:(編集:と本当にスーツを無視するように固定し、ちょうどあなたの元の正規表現である)

(?=.*([2-9TJQKA])[SHDC].*\1[SHDC].*\1[SHDC])(?=.*((?!\1)[2-9TJQKA])[SHDC].*\2[SHDC]) 

それは最初の先読みと「3」のシーケンスを探します。 「2」シーケンスを探している第2の先読みには、重複一致を防ぐために、その中に否定的な先読みが含まれています。正規表現は完全に2つの先読みで構成されています。これは、実際に文字を一致させた場合(ポインタを先に移動した場合)、これらのサブパターンは文字列のどこにでも自由に一致します。代わりに、正規表現の

online demo here

+0

これはそれです!ありがとう! –

1

、あなたはそれらのランクの1が3つのスーツを持っているかどうかを確認、その後、グアバMultimapはを使用して、2つだけ異なるランクを持っているかどうかを確認できます。

public class Foo { 
    public static void main(String[] a) { 
     String s = "KD KC AH AC AD"; 
     Splitter splitter = Splitter.on(' '); 
     System.out.println(checkFullHouse(splitter.split(s))); 
    } 

    private static boolean checkFullHouse(Iterable<String> in) { 
     Multimap<String, Object> m = ArrayListMultimap.create(); 
     Splitter splitter = Splitter.fixedLength(1); 
     in.forEach(s -> { 
      List<String> l = Lists.newArrayList(splitter.split(s)); 
      m.put(l.get(0), l.get(1)); 
     }); 
     return m.keySet().size() == 2 && (int) m.keySet().stream().filter(v -> m.get(v).size() == 3).count() == 1; 
    } 
} 
+0

以前はMultimapで作業していませんでしたが、これはもっと簡単に見えます。それを調べるつもり:) –

+1

入力を検証するためにキーワード 'assert'を使用しないでください!また、Guavaを使用する場合、メソッド 'String :: split'の代わりに' Splitter'クラスを使用してください( 'split'は正規表現を使用するので...避けたい場合は避けてください;) –

+1

変更されました@OlivierGrégoire – baao

関連する問題