2016-08-15 5 views
1

Momentan programmiere ich einen Twitch-Bot mit pIRC auf Java.String regex in Java für Twitch-Bot

Ich möchte Befehle wie zB !<command> [<tagged-user>]

Vorerst ich diesen Code verwenden, um auszusortieren:

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. 
    } 
} 

ich zum Beispiel bekommen !info testuser:

testuser [here is the command response]

Ich möchte verbessern der Code, indem nur der Lochprozess neu definiert wird.

Grundsätzlich möchte ich eine Regex, die den Befehlsnamen liest und wenn es jemand markiert ist, sollte es auch den getaggten Benutzernamen lesen.

Kinda wie Pattern pattern = Pattern.compile("!COMMANDNAME [TAGGEDUSER]");

Danke mir geholfen, ich struggelt alot mit regex in letzter Zeit, aber ich will es verstehen. Online Regexing wird mir nicht viel helfen.

+1

Haben Sie so etwas wie das bedeutet: '[A-Za-z] + (\ s \ [[A-Za-z 0! -9] + \]) {0,1} '? Dieses Muster entspricht '! Qwertz' und'! Qwertz [Something123] ' – Blobonat

+0

@Blobonat Warum' {0,1} 'anstelle von'? '? – RealSkeptic

+0

@RealSkeptic Weil ich finde es besser lesbar, aber es gibt keinen besonderen Grund. – Blobonat

Antwort

0

Verwenden Sie Erfassungsgruppen. Deine aktuelle Regex setzt das '!' in einer einfangenden Gruppe aus irgendeinem Grund, aber es benutzt es nicht. Platzieren Sie die Klammern stattdessen um die wichtigen Teile des Musters, das Sie erfassen möchten.

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

Was wir hier haben, ist:

  • A "!"
  • Ein oder mehrere Wortzeichen, von denen erwartet wird, dass sie der Befehl sind. Sie sind von Klammern umgeben, daher sind sie die erste einfangende Gruppe.
  • Dann eine nicht erfassende Gruppe für ein optionales Argument. Da es optional ist, fügen wir ein '?' nach dieser Gruppe. In dieser Gruppe:
    • Ein oder mehrere Räume
    • Eine Erfassungsgruppe für einen oder mehrere nicht-Räume

Also im Grunde haben wir zwei einfangende Gruppen, aber einer von ihnen wird nicht wenn kein Argument vorhanden ist Wenn Sie matcher.find() aufrufen, können Sie matcher.group(1) und matcher.group(2) verwenden, um auf die erfassten Gruppen zuzugreifen. group(2) kann Null zurückgeben, da keine Übereinstimmung gefunden wird, wenn kein Argument vorhanden ist.

Demonstration Code:

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

Ausgang:

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.