正则表达式适用于测试用例,但不适用于实际代码

时间:2016-05-06 11:18:35

标签: java regex

我有以下表达表示扑克牌图案的表达式:

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();            
    }

那么这里的问题是什么?为什么它不起作用?

1 个答案:

答案 0 :(得分:3)

[1-14]字符类仅匹配14。如果您需要匹配114之间的数字,请使用(?:1[0-4]|0?[1-9])

这个正则表达式应该适用于:

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

请参阅this demo

注意:使用String.matches(),您不需要^$(您可以将其从模式中删除)。