Java 正则表达式在测试用例中工作,但在实际代码中不工作

Java 正则表达式在测试用例中工作,但在实际代码中不工作,java,regex,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"); Strin

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

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));                
    }
然而,当我将其用于卡构造函数时,它总是返回false。下面的代码稍微修改了一下,我没有检查结果,进一步的解密方法很好

public Card(String cardSymbol) throws UnknownCardException {

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

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

那么这里有什么问题?为什么不起作用?

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

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

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


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

您打算与
[1-14]
匹配什么?您知道它只与
1
4
匹配吗?如果需要匹配1到14之间的数字,请使用
(?:1[0-4]| 0?[1-9])
。看到了吗?这就是你所期望的吗?所以我实际上很幸运,我的测试意外地检查了H:14,这是这里唯一的有效值-谢谢