Twitch-Bot Java 中的字符串正则表达式
String regex in Java for Twitch-Bot
目前我正在 Java 上使用 pIRC 编写 Twitch-Bot。
我想整理命令,例如 !<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]");
谢谢你帮助我,我最近在正则表达式上苦苦挣扎,但我想了解它。在线正则表达式对我帮助不大。
使用捕获组。您当前的正则表达式将“!”由于某种原因在捕获组中,但它不使用它。相反,将括号放在您要捕获的模式的重要部分周围。
Pattern pattern = Pattern.compile("^!(\w+)(?:\s+(\S+))?");
我们这里有:
- 一个“!”
- 一个或多个预期为命令的单词字符。它们被括号括起来,所以它们是第一个捕获组。
- 然后是可选参数的非捕获组。由于它是可选的,我们添加一个“?”在这组之后。在这个组中:
- 一个或多个空格
- 一个或多个非空格的捕获组
所以基本上,我们有两个捕获组,但是如果没有参数,其中一个将不会被匹配。
现在如果您调用 matcher.find()
,您可以使用 matcher.group(1)
和 matcher.group(2)
访问捕获的组。 group(2)
可能 return 为 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.
目前我正在 Java 上使用 pIRC 编写 Twitch-Bot。
我想整理命令,例如 !<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]");
谢谢你帮助我,我最近在正则表达式上苦苦挣扎,但我想了解它。在线正则表达式对我帮助不大。
使用捕获组。您当前的正则表达式将“!”由于某种原因在捕获组中,但它不使用它。相反,将括号放在您要捕获的模式的重要部分周围。
Pattern pattern = Pattern.compile("^!(\w+)(?:\s+(\S+))?");
我们这里有:
- 一个“!”
- 一个或多个预期为命令的单词字符。它们被括号括起来,所以它们是第一个捕获组。
- 然后是可选参数的非捕获组。由于它是可选的,我们添加一个“?”在这组之后。在这个组中:
- 一个或多个空格
- 一个或多个非空格的捕获组
所以基本上,我们有两个捕获组,但是如果没有参数,其中一个将不会被匹配。
现在如果您调用 matcher.find()
,您可以使用 matcher.group(1)
和 matcher.group(2)
访问捕获的组。 group(2)
可能 return 为 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.