2016-05-06 1 views
1

に私はトランプ柄表す次の式はありませ:正規表現は、テストケースで動作しますが、実際のコード

String RCARD1 = "[CDHS]{1}\\:\\d{1,2}[1-14]"; 

私は私のテストケースでテストしたときに期待どおりに動作しますが、ここでのテストがありますケース:

@Test 
    public void checkRegex() throws AssertionError { 
     System.out.println("Checking the correctness of card regular expressions"); 

     String RCARD1 = "[CDHS]{1}\\:\\d{1,2}[1-14]"; 
     String cardSymbol = "H:14"; 
     assertTrue(cardSymbol.matches(RCARD1)); 

     cardSymbol = "C:16"; 
     assertFalse(cardSymbol.matches(RCARD1)); 

     cardSymbol = "Z:5"; 
     assertFalse(cardSymbol.matches(RCARD1));     
    } 

これをCardコンストラクタに使用すると、常にfalseが返されます。次のコードは若干修正されていますが、結果を確認しないと、さらに解読メソッドが正常に動作します。

public Card(String cardSymbol) throws UnknownCardException { 

     boolean res = cardSymbol.matches(RCARD1); //fails here !!! 

     if (this.decypherCard(cardSymbol)) {    
     }    
     else throw new UnknownCardException();    
    } 

ここで問題は何ですか?なぜそれは働いていないのですか?

+2

あなたは '[1-14]'と何を一致させるつもりですか?あなたはそれが '1'と' 4'だけにマッチすることを知っていますか? 1から14までの数字を一致させる必要がある場合は、 '(?:1 [0-4] | 0?[1-9])'を使用します。 [このデモ](https://regex101.com/r/wP1lJ2/1)を参照してください - それはあなたの期待ですか? –

答えて

3

[1-14]文字クラスは、14と一致します。数字を1から14に一致させる必要がある場合は、(?:1[0-4]|0?[1-9])を使用してください。

、この正規表現は、動作するはずです:

^[CDHS]:(?:1[0-4]|0?[1-9])$ 

this demoを参照してください。

String.matches()を使用すると、^$を(あなたがパターンからそれらを削除する場合があります)必要はありません。

+1

私は実際にH:14を誤ってチェックしている私のテストでは本当にラッキーでした、そして、それはここで唯一の有効な値です - ありがとう – smoczyna

関連する問題