2016-08-15 41 views
1

目前,我正在使用Java上的pIRC對Twitch-Bot進行編程。用於Twitch-Bot的Java中的字符串正則表達式

我想理清例如像!<command> [<tagged-user>]

命令現在我使用這些代碼:

private boolean checkForCommand(String message) { 
    Pattern pattern = Pattern.compile("^(!)\\w+"); 
    Matcher m = pattern.matcher(message); 
    return m.find(); 
} 

public void onMessage(String channel, String sender, String login,String hostname, String message){ 
    String user = sender; 
    if(checkForCommand(message)){ 
     String[] arguments; 
     if(message.split("\\s+").length > 1){ 
      arguments = message.split("\\s+"); 
     }else { 
      arguments = new String[1]; 
      arguments[0] = message; 
     } 
     String command = arguments[0].substring(1, arguments[0].length()); 
     if(arguments.length > 1){ 
      user = arguments[1]; 
     } 
     respondForCommand(command,user); // User gets respond for his command. 
    } 
} 

我得到例如!info testuser

testuser [here is the command response]

我想提高代碼只通過正則表達式處理。

基本上我想要一個正則表達式讀出命令名,如果有人給它加上標籤,它也應該讀取帶標籤的用戶名。

有點像Pattern pattern = Pattern.compile("!COMMANDNAME [TAGGEDUSER]");

謝謝你幫我,我正則表達式struggelt很多最近,但我想了解它。在線regexing不會幫助我很多。

+1

你的意思是類似的東西:'[A-ZA-Z] +(\ S \ [A-ZA-Z0! -9] + \]){0,1}'?這種模式匹配'!Qwertz'和'!Qwertz [Something123]' – Blobonat

+0

@Blobonat爲什麼使用'{0,1}'而不是'?'? – RealSkeptic

+0

@RealSkeptic因爲我覺得它更具可讀性,但沒有特別的理由。 – Blobonat

回答

0

使用捕獲組。你當前的正則表達式將'!'在一個捕獲組中,出於某種原因,但它沒有使用它。相反,將圓括號放在要捕獲的模式的重要部分周圍。

Pattern pattern = Pattern.compile("^!(\\w+)(?:\\s+(\\S+))?"); 

我們在這裏是:

  • A 「!」
  • 預期爲命令的一個或多個單詞字符。它們被括號包圍,所以它們是第一個捕獲組。
  • 然後是可選參數的非捕獲組。由於它是可選的,我們添加一個'?'在這個小組之後。在這組:
    • 一個或多個空格
    • 的一個或多個非空間

因此,基本上,我們有兩個捕獲組,但他們中的一個捕獲組不會如果沒有參數可以匹配。

現在,如果您撥打matcher.find(),則可以使用matcher.group(1)matcher.group(2)訪問捕獲的組。 group(2)可能會返回null,因爲如果沒有參數,它將不會匹配。

示範代碼:

public class SimpleTest { 
    public static void main(String[] args) { 
     Pattern pattern = Pattern.compile("^!(\\w+)(?:\\s+(\\S+))?"); 
     Matcher matcher; 
     String[] testStrings = { "!command john", "!command john something", "!commandWithoutArguments", 
       "!commandNoArgsButSpaces ", "Not A command." }; 

     for (String testString : testStrings) { 
      System.out.print("String <<" + testString + ">> "); 
      matcher = pattern.matcher(testString); 
      if (matcher.find()) { 
       String command = matcher.group(1); 
       String user = matcher.group(2); 
       if (user == null) { 
        user = "default"; 
       } 
       System.out.println("is a command: " + command + " user: " + user + "."); 
      } else { 
       System.out.println("is not a command."); 
      } 
     } 
    } 
} 

輸出:

String <<!command john>> is a command: command user: john. 
String <<!command john something>> is a command: command user: john. 
String <<!commandWithoutArguments>> is a command: commandWithoutArguments user: default. 
String <<!commandNoArgsButSpaces >> is a command: commandNoArgsButSpaces user: default. 
String <<Not A command.>> is not a command.