正则表达式在测试用例中有效,但在实际代码中无效



我有以下表达式来表示扑克牌模式:

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-14]字符类仅与14匹配。如果需要从114匹配数字,请使用(?:1[0-4]|0?[1-9])

这个正则表达式应该可以工作:

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

请参阅此演示。

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

最新更新