Очевидно, что для IRC-бота ввод генерируется пользователем, набирающим одну строку, обычно с командой и несколькими аргументами, каждая из которых разделяется пробелом. Я кодирую бот IRC с использованием Java и хотел бы проанализировать аргументы, которые могут различаться по длине символов и сохранять их в несколько строк для использования позже. Я хотел бы сделать команду, которая выглядит примерно так:
bot.command argument1 argument2 argument3
и я хочу, чтобы это было так, что если сообщение начинается с bot.command
, тогда user
будет хранить argument1
, time
будет хранить argument2
, а date
будет хранить argument3
. Дело в том, что argument1
, argument2
и argument3
могут различаться по длине символов, поэтому выполнение чего-то вроде time = message.substring(33, message.length())
прекратит чтение в конце аргумента, но оно выиграло Всегда читайте строку, где начинается текст argument3
. Мне нужно определить, где находится разделительное пространство, и начать читать argument3
с одного символа после этого. И я не могу использовать операторы If, чтобы определить, какие аргументы могут быть, потому что они могут быть чем угодно. Здесь шаблон, если приведенный выше параграф не ясен:
String message //= the IRC message and bot input
String user;
String time;
String date;
if (message.startsWith("bot.command")) {
user = message.substring(13, detect next space here and stop reading one character before);
time = message.substring(detect where previous space was and start one character after that, end before next space);
date = message.substring(detect where previous space was and start one character after that, message.length());
}
Надеюсь, что это иллюстрирует то, что я пытаюсь сделать. Спасибо за помощь!
Изменить (удалено пример StringTokenizer) -
Поскольку StringTokenizer
по-видимому, "устаревший", я бы использовал такой Сканер -
String message = "BOT.command USER_X THIS_IS_A_TIME THIS_IS_A_DATE";
String user = null;
String time = null;
String date = null;
// Use toLowerCase - assuming it case insensitive.
if (message.toLowerCase()
.startsWith("bot.command")) {
Scanner st = new Scanner(message);
if (st.hasNext()) {
st.next();
}
if (st.hasNext()) {
user = st.next();
}
if (st.hasNext()) {
time = st.next();
}
if (st.hasNext()) {
date = st.next();
}
}
System.out.printf(
"User = %s, Time = %s, Date = %s\n", user,
time, date);
Выход
User = USER_X, Time = THIS_IS_A_TIME, Date = THIS_IS_A_DATE
Я бы рекомендовал использовать String.split, который разбивает строку на массив с использованием регулярного выражения разделителя. В вашем случае вы можете:
String[] args = message.split("\\s+");
if (args[0].equals("bot.command"))
{
user = args[1];
...
}
Причина, по которой я разделяю шаблон \s+
(соответствует одному или нескольким символам пробела) вместо просто пространства, заключается в том, что таким образом программа не будет разбиваться, если аргументы разделены более чем одним пространством или чем-то вроде вкладку.
Если вы вводите пользовательский ввод, где вы не уверены в том, сколько вводимых пробелов пространства будет введено, вы можете сделать следующее:
String[] terms = message.split("\\s+");
for(String word1 : terms) {
// doSomething()
}
Но в вашем случае вам просто нужно 3 аргумента, поэтому цикл цикла будет выполняться 3 раза в цикле for.
indexOf
или, может быть, дажеsplit
.