Получить части строки — C # .NET Core 3.1

#c# #asp.net-core #stringreader #stringwriter

#c# #asp.net-core #stringreader #stringwriter

Вопрос:

У меня есть строка из журнала:

2020-09-07 14:41:17.268 01:00 [Information] Hello, Serilog!

Я хотел бы извлечь слово Information из string , однако это изменится, как могло бы быть debug , или на любом другом известном уровне ведения журнала.

Я также хотел бы сообщение, которое через один пробел после ] которого в данном случае является Hello, Serilog! . Это также может быть изменено, но оно не будет длиннее существующего сообщения.

Строка поступает из StringReader

  using (StringReader reader = new StringReader(message.ToString())) // message from StringWriter
{
    var readText = reader.ReadLine();
    Console.WriteLine(readText);
}
  

Каков наилучший способ сделать это?

Комментарии:

1. Поскольку строка всегда будет содержать скобки, [] вы можете разделить строку на последнюю ] и получить все, что после, в качестве сообщения и все, что до [ , в качестве типа журнала. или вы можете использовать регулярное выражение.

2. Спасибо, я просто смотрю на регулярное выражение сейчас

3. Если вы пытаетесь анализировать журналы, возможно, было бы проще выводить журналы в формате JSON, если для вас это возможно.

Ответ №1:

Использование регулярного выражения приведет к Information: Hello, Serilog!

 string type;
string message;

string text = "2020-09-07 14:41:17.268  01:00 [Information] Hello, Serilog!";
string pattern = "\[(.*?)\]";
var match = Regex.Match(text, pattern);
if (match.Success)
{
    type = match.Groups[1].Value;
    message = text.Substring(match.Groups[1].Index   match.Groups[1].Length   1);
    Console.WriteLine(type   ": "   message);
}            
  

Ответ №2:

Регулярное выражение можно использовать следующим образом:

 var regex = new Regex("\[([^\]] )\]");
var match = regex.Match(readText);
if (match.Success)
{
    var value = match.Groups[1].Value;
    // value == "Information" or whatever between [ and ]
}
else
{
    // Handle pattern not matching
}