我有以下表达表示扑克牌图案的表达式:
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();
}
那么这里的问题是什么?为什么它不起作用?
答案 0 :(得分:3)
[1-14]
字符类仅匹配1
和4
。如果您需要匹配1
到14
之间的数字,请使用(?:1[0-4]|0?[1-9])
。
这个正则表达式应该适用于:
^[CDHS]:(?:1[0-4]|0?[1-9])$
请参阅this demo。
注意:使用String.matches()
,您不需要^
和$
(您可以将其从模式中删除)。