我有以下表达式来表示扑克牌模式:
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]
字符类仅与1
和4
匹配。如果需要从1
到14
匹配数字,请使用(?:1[0-4]|0?[1-9])
。
这个正则表达式应该可以工作:
^[CDHS]:(?:1[0-4]|0?[1-9])$
请参阅此演示。
注意:使用String.matches()
,您不需要^
和$
(您可以将它们从模式中删除)。