Java - Как я могу проверить наличие следующего пробела в строке? (Для IRC Bot)

1

Очевидно, что для 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());
}

Надеюсь, что это иллюстрирует то, что я пытаюсь сделать. Спасибо за помощь!

Показать ещё 1 комментарий
Теги:
string
bots
irc

3 ответа

0
Лучший ответ

Изменить (удалено пример 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
  • 0
    Спасибо! Это казалось лучшим и самым ясным вариантом для меня. Еще раз спасибо всем!
1

Я бы рекомендовал использовать String.split, который разбивает строку на массив с использованием регулярного выражения разделителя. В вашем случае вы можете:

String[] args = message.split("\\s+");
if (args[0].equals("bot.command"))
{
    user = args[1];
    ...
}

Причина, по которой я разделяю шаблон \s+ (соответствует одному или нескольким символам пробела) вместо просто пространства, заключается в том, что таким образом программа не будет разбиваться, если аргументы разделены более чем одним пространством или чем-то вроде вкладку.

0

Если вы вводите пользовательский ввод, где вы не уверены в том, сколько вводимых пробелов пространства будет введено, вы можете сделать следующее:

String[] terms = message.split("\\s+");
for(String word1 : terms) {
//    doSomething() 
}

Но в вашем случае вам просто нужно 3 аргумента, поэтому цикл цикла будет выполняться 3 раза в цикле for.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню