разбить строку на определенные разделы - PullRequest
1 голос
/ 19 декабря 2009

Мне нужно создать простой способ разбить некоторые строки на отформатированные строки, например, у меня есть эта строка

":JStoker!stoker@jcs.me.uk PRIVMSG #channel :test message"

и мне нужно разделить это на:

string nickname = "JStoker"
string ident = "stoker"
string host = "jcs.me.uk"
string channel = "#channel"
string message = "test message"

и мне нужно сделать это так, чтобы, если, скажем, я получил строку вроде

":irc.testnet.com PRIVMSG #channel :test message"

например, мне нужно что-то вроде

string nickname = "irc.testnet.com"
string ident = ""
string host = ""
string channel = "#channel"
string message = "test message"

через одно и то же, без выдачи ошибки ... и строка, которую я использую, постоянно меняется, если вы знакомы, это необработанные данные IRC ... мне просто нужно знать, как эффективно анализировать данные.

возможно, это можно сделать через Regex, но я не уверен. пожалуйста помоги! ~ примеры кодов, пожалуйста

Ответы [ 3 ]

2 голосов
/ 19 декабря 2009

Да, регулярное выражение, подобное этому, должно делать это:

^:(\w+)(?:!(\w+)@([\w\.]+))? PRIVMSG (#\w+) :(.+)$

Пример:

Match m = Regex.Match(input, @"^:(\w+)(?:!(\w+)@([\w\.]+))? PRIVMSG (#\w+) :(.+)$");
string nickname = m.Groups[1].Value;
string ident = m.Groups[2].Value;
string host = m.Groups[3].Value;
string channel = m.Groups[4].Value;
string message = m.Groups[5].Value;

Примечание: \w соответствует A-Z a-z 0-9 _, может потребоваться использовать другой набор в зависимости от того, какие символы могут содержать разные идентификаторы.

1 голос
/ 19 декабря 2009

То, что я делаю для разделения сообщений IRC, (в простых терминах, поскольку я не помню точный код в C #), это:

  • Удалить первое:
  • Разделить на: это дает вам два элемента, последний параметр «сообщения» и все остальное
  • Разделите «все остальное» на пробел, что даст вам все остальные параметры.
  • Затем вы можете использовать простой метод для разбора строки ника на разные части (это должны сделать еще два сплита)

Этот метод для меня более уместен, чем создание для него регулярного выражения, хотя я не уверен насчет разницы в производительности (я был бы готов поспорить, что в любом случае это не имеет значения, если вы просто пишете клиент)

В качестве альтернативы вы можете сделать это:

  • Разбить строку на пробел
  • Пройдите по результирующему массиву и проверьте, начинается ли элемент с:, если это так, объедините этот и следующие элементы с пробелом, чтобы получить полную строку.

Хотя я не уверен, что "быстрее", но я считаю, что второе менее изящно.

Они должны работать независимо от того, какую команду вы вводите (и поэтому могут использоваться для общего анализа), и вы должны обратить внимание на тот факт, что не все команды будут иметь элемент, начинающийся с:. Например, команда NICK допускает использование только одного слова, и такие слова обычно не экранируются с помощью: другие команды имеют несколько отдельных слов перед: (команда USER имеет два)

1 голос
/ 19 декабря 2009
/\"\:(?:(.+)\!(.+)\@)?([^ ]+) PRIVMSG([^ ]+) \:(.+)\"/

$nick = $3
$ident = $1
$host = $2
$chan = $4
$message = $5

я избежал всех символов только потому, что это зависит от механизма регулярных выражений. Вы должны удалить те, которые не являются специальными символами, в зависимости от того, что вы используете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...