c # регулярное выражение значения после определенных слов - PullRequest
2 голосов
/ 04 ноября 2019

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

Слот: 0 Модуль: Нет модуля в слоте

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

 var pattern = "(?<=:)[a-zA-Z0-9]+";
 foreach (string config in backplaneConfig)
 {
     List<string> values = Regex.Matches(config, pattern).Cast<Match>().Select(x => x.Value).ToList();
     modulesInfo.Add(new ModuleIdentyfication { ModuleSlot = Convert.ToInt32(values.First()), ModuleType = values.Last() });
 }

Так что часть слота работает, ноМодуль работает, только если это слово без пробелов, в моем примере это даст мне только «Нет». Есть ли способ сделать это

Ответы [ 5 ]

2 голосов
/ 04 ноября 2019

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

var pattern = @"Slot:(\d+)\s*Module:(.+)";
foreach (string config in backplaneConfig)
{
    var values = Regex.Match(config, pattern);
    if (values.Success)
    {
        modulesInfo.Add(new ModuleIdentyfication { ModuleSlot = Convert.ToInt32(values.Groups[1].Value), ModuleType = values.Groups[2].Value });
    }
 }

См. Демонстрационную версию regex . Группа 1 - это ModuleSlot, а Группа 2 - это ModuleType.

Подробности

  • Slot: - буквальный текст
  • (\d+) - Группа захвата 1: одна или несколько цифр
  • \s* - 0+ пробелов
  • Module: - буквенный текст
  • (.+) - Группа захвата 2: остаток строки до конца.
0 голосов
/ 04 ноября 2019

Вам не нужно использовать регулярные выражения для такого простого анализа. Попробуйте ниже:

var str = "Slot:0 Module:No module in slot";
str.Split(new string[] { "Slot:", "Module:"},StringSplitOptions.RemoveEmptyEntries)
  .Select(s => s.Trim());
0 голосов
/ 04 ноября 2019

Пожалуйста, замените это:

 // regular exp.
(\d+)\s*(.+)
0 голосов
/ 04 ноября 2019

Другим вариантом является сопоставление либо 1+ цифр, за которыми следует граница слова, либо совпадение с повторяющимся шаблоном, используя ваш класс символов, но начинающийся с [a-zA-Z]

(?<=:)(?:\d+\b|[a-zA-Z][a-zA-Z0-9]*(?: [a-zA-Z0-9]+)*)
  • (?<=:) Assert a : слева
  • (?: Группа без захвата
    • \d+\b Совпадение с 1+ цифрами, за которыми следует граница слова
    • | Или
    • [a-zA-Z][a-zA-Z0-9]* Начать матч с a-zA-Z
    • (?: [a-zA-Z0-9]+)* При желании повторить пробел и то, что указано в классе символов
  • ) Закрытьв группе захвата

Regex demo

0 голосов
/ 04 ноября 2019

Самый простой способ - добавить пробел к вашему шаблону

var pattern = "(?<=:)[a-zA-Z0-9 ]+";

Но лучшим решением, вероятно, будет ответ от @Wiktor Stribiżew

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