C # разделительная строка из трех частей - PullRequest
1 голос
/ 29 февраля 2012

Привет Всем, кого я задавал этот вопрос несколько часов назад C # получить имя пользователя из строки.split

Теперь у меня сложная проблема.Попытка получить Acid Player и m249 из этой строки

    L 02/28/2012 - 06:14:22: "Acid<1><VALVE_ID_PENDING><CT>" 
killed "Player<2><VALVE_ID_PENDING><TERRORIST>" with "m249"

Я пробовал это

int start = Data.ToString().IndexOf('"') + 1;
            int end = Data.ToString().IndexOf('<');
            var Killer = Data.ToString().Substring(start, end - start);

            int start1 = Data.ToString().IndexOf("killed") + 1;
            int end1 = Data.ToString().IndexOf('<') + 4;
            var Victim = Data.ToString().Substring(start1, end1 - start1);

, но это показывает это исключение в последней строке

Length cannot be less than zero.
Parameter name: length

Можно ли получить как имя игрока, так и последнюю строку (м249)

Танки

Ответы [ 2 ]

4 голосов
/ 29 февраля 2012

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

Использование System.Text.RegularExpressions;

Код:

string input = "L 02/28/2012 - 06:14:22: \"Acid<1><VALVE_ID_PENDING><CT>\" killed \"Player<2><VALVE_ID_PENDING><TERRORIST>\" with \"m249\"";
Regex reg = new Regex("[^\"]+\"([^<]+)<[^\"]+\" killed \"([A-Za-z0-9]+)[^\"]+\" with \"([A-Za-z0-9]+)\"");
Match m = reg.Match(input);
if (m.Success)
{
    string player1 = m.Groups[1].ToString();
    string player2 = m.Groups[2].ToString();
    string weapon = m.Groups[3].ToString();
}

Синтаксическая разбивка для регулярного выражения такова:

[^ \ "] +

означает, что идти, пока мы не нажмем двойную кавычку (")

\ "

означает принять кавычку в качестве следующей части строки, так как предыдущий термин приводит нас к ней, но не проходит мимо нее.

([^ <] +) <</p>

Скобка означает, что мы заинтересованы в результатах этой части, мы будем искать, пока не достигнем меньше, чем (<). поскольку это первая «группа», которую мы собираемся извлечь, в матче она называется Groups [1]. И снова у нас есть персонаж, которого мы искали, чтобы использовать его и продолжить поиск. </p>

<[^ \ "] + \" убит \ "</p>

Это снова будет искать, не сохраняя результаты без скобок, пока мы не достигнем следующей кавычки. Затем мы вручную указываем строку ("kill"), так как нас интересует, что после этого.

([A-Za-z0-9] +)

Это будет захватывать любые символы для результата нашей группы [2], которые состоят из букв, цифр, верхнего или нижнего регистра.

[^ \ "] + \"

Поиск и игнорирование остальных, пока мы не найдем следующую двойную кавычку

с \ "

Другая литеральная строка, которую мы используем в качестве маркера

* +1054 * ([A-Za-z0-9] +)

То же, что и выше, вернуть буквенно-цифровое значение как наша группа [3] с круглыми скобками

\ "

Завершите последнюю цитату.

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

2 голосов
/ 29 февраля 2012

Должно быть супер легко разобрать. Я понял, что это был CS. Посмотрите документацию Valve здесь:

https://developer.valvesoftware.com/wiki/HL_Log_Standard#057._Kills

Обновление:

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

    public void Parse(string killLog)
    {
        string[] parts = killLog.Split(new[] { " killed ", " with " }, StringSplitOptions.None);
        string player1 = parts[0].Substring(1, parts[0].IndexOf('<') - 1);
        string player2 = parts[1].Substring(1, parts[1].IndexOf('<') - 1);
        string weapon = parts[2].Replace("\"", "");
    }

Лично я бы использовал RegEx.

...