我需要将一个字符串从服务器传递给客户端。该字符串以“P1”开头,后跟扑克牌的名称。我想在客户端使用正则表达式检查它是否以“P1”开头,如果是,则从其余字符串中提取卡信息并显示该卡。但是,我似乎无法使用正则表达式来识别传入的字符串。
服务器端:
for(int i = 0; i < players.length; i++) {
imagePath1 = players[i].getCard(0).getImagePath();
imagePath2 = players[i].getCard(0).getImagePath();
output.format("%s\n", "Pocket Cards");
output.flush();
output.format("%s\n", "P1, " + imagePath1);
output.flush();
}
客户方:
public void run() {
playerNumber = input.nextLine();
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
lblIdField.setText("You are Player " + playerNumber + ".");
}
}
);
myTurn = (playerNumber.equals("Player 1"));
while(true) {
if(input.hasNextLine()) {
processMessage(input.nextLine());
}
}
}
public void processMessage(String message) {
if(message.equals("Pocket Cards")) {
//displayPocketCards("resources/10C.png");
}
else if(message.matches("P1, [.]*")) {
String[] split = message.split(", ");
displayPocketCards("resources/10C.png");
}
}
答案 0 :(得分:0)
当你创建一个包含.
的字符类时,它不会被解释为“任何”通配符,它会被解释为一个句点。您的邮件与“P1,
完全匹配,后跟零或更多。”所以你不要进入那个街区。如果你只想要“匹配任何零次或多次”,那只是.*
没有括号。虽然通常明智地比这更具体一点!
答案 1 :(得分:0)
我假设您要匹配以P开头的字符串,后跟一个或多个数字,逗号,分隔符,然后是任何其他字符。
以下代码可能会解决问题:
...
else if(message.matches("^(P)(\\d)+(\\,)(\\s)(.)*")) {
String[] split = message.split(", ");
displayPocketCards("resources/10C.png");
}
}
你可以使用匹配的积木来获取你的玩家的身份证,以及播放的卡片......
您可以使用多个正则表达式测试网站来检查您的正则表达式,这里有一个http://www.regexplanet.com/advanced/java/index.html
答案 2 :(得分:0)
我建议使用matches()
,而不是使用方法startsWith()
。因此,您可以使用message.matches("P1, [.]*"))
代替message.startsWith("P1")
。
要解析卡片信息,我建议您在数字和卡片类型之间使用另一个逗号(和空格)。然后,您可以轻松使用拆分功能调用Integer.parseInt(split[1])
作为数字,split[2]
作为类型。