如何将字符串传递给客户端并使用RegEx来决定采取何种操作?

问题描述:

我需要从服务器传递一个字符串到客户端。该字符串以“P1”开头,后面跟着一张纸牌的名字。我想在客户端使用正则表达式来检查它是否以“P1”开头,如果是,则从该字符串的其余部分拉出卡信息并显示该卡。不过,我似乎无法获得正则表达式识别传入的字符串如何将字符串传递给客户端并使用RegEx来决定采取何种操作?

服务器端:

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"); 
    } 
} 
+1

正确的消息究竟是怎样的? – ddmps 2013-03-04 22:27:25

+0

我认为从长远来看,您可以更好地使用XML或JSON或其他类型的服务。如果你决定让事情更复杂,你的方法将无法应付。 – Creakazoid 2013-03-04 22:28:04

+0

正确的信息看起来像“P1,10C”,其中10C表示10个俱乐部。 P1代表玩家卡1。 – 2013-03-04 22:31:16

我假设你想匹配以P开头的字符串,接着是一个或几个数字,一个逗号,一个分隔符,然后是任何其他字符。

下面的代码可能会做的伎俩:

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

Furhter你可以使用匹配块,让您的播放器的ID和发挥卡...

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

当你做出一个包含.字符类它不被解释为“任何”通配符,它​​被逐字解释为一个句点。您的邮件不完全匹配“P1,”,然后是零或更多。“所以你不要输入该块。如果您只想“零次或多次匹配”,那么只需要.*而没有括号。尽管比这更具体些,通常是明智的!

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

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