0

我需要将一个字符串从服务器传递给客户端。该字符串以“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");
    }
}
4

3 回答 3

0

当您使包含.它的字符类不被解释为“任何东西”通配符时,它会按字面意思解释为句点。P1,您的消息与“后跟零个或多个 .”不完全匹配。所以你不要进入那个街区。如果您只想“匹配零次或多次”,那就是.*没有括号。虽然比这更具体一点通常是明智的!

于 2013-03-04T22:49:33.200 回答
0

我假设您想匹配以 P 开头的字符串,后跟一个或多个数字、逗号、分隔符,然后是任何其他字符。

以下代码可能会解决问题:

    ...
    else if(message.matches("^(P)(\\d)+(\\,)(\\s)(.)*")) {
        String[] split = message.split(", ");
        displayPocketCards("resources/10C.png");
    }
}

此外,您可以使用匹配块来获取玩家的 id,以及打出的牌...

您可以使用许多正则表达式测试站点来检查您的正则表达式,这里有一个http://www.regexplanet.com/advanced/java/index.html

于 2013-03-04T22:49:59.793 回答
0

而不是使用matches()我建议使用的方法startsWith()。因此,message.matches("P1, [.]*"))您可以使用message.startsWith("P1").

要解析卡片信息,我建议您在数字和卡片类型之间使用另一个逗号(和空格)。然后,您可以轻松地使用拆分功能,您必须Integer.parseInt(split[1])为号码和split[2]类型调用。

于 2013-03-04T22:50:32.557 回答