Справка по Regex, парсинг в NameValueCollection

У меня проблема с RegEx, Я получаю строку, которая должна быть проанализирована в NameValueCollection, ParseQueryString не работает, потому что (1) строка разделена пробелом и (2) значения могут содержать пробелы. У меня нет контроля над входом.

Пример строки:

-AppCode='MyApplication' -AppVers='V-2016.0 Debug' -MachUuid='2C850880-34FD-12F3-A06B-7336B0C4BC55' -MachName='ABEZG-F05507' -Language=2055

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

Я пробовал:

  • [\w\-]+=[\w\s\']+(?![\w\-]+=[\w\s\'\-])

но это не учитывает дефисы в значении

  • [\w\-]+=[\w\s\'\-]+(?![\w\-]+=[\w\s\'\-])

Это так, но это заполняет космический символ.

Идеальный результат будет:

-AppCode MyApplication
-AppVers V-2016.0 Debug
-MachUuid 2C850880-34FD-12F3-A06B-7336B0C4BC55
-MachName ABEZG-F05507
-Language 2055

К сожалению, после всех этих лет я до сих пор не могу понять, RegEx, Любая помощь будет оценена!

1 ответ

Решение

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

(?<name>[\w-]+)=(?:'(?<value>[^']*)'|(?<value>\S+))

Посмотреть демо-версию регулярного выражения

([\w-]+) захватывает в группу с именем "имя" слова и дефисные символы. (?:'(?<value>[^']*)'|(?<value>\S+)) будет соответствовать либо одинарные кавычки значения ('[^']*') не пропусков (\S+), но поместит в группу с именем "value" только непробельные символы или содержимое внутри '...' исключая сами цитаты.

Пример C# демо:

var str = "-AppCode='MyApplication' -AppVers='V-2016.0 Debug' -MachUuid='2C850880-34FD-12F3-A06B-7336B0C4BC55' -MachName='ABEZG-F05507' -Language=2055";
var matches = Regex.Matches(str, @"(?<name>[\w-]+)=(?:'(?<value>[^']*)'|(?<value>\S+))")
    .Cast<Match>()
    .ToDictionary(p => p.Groups["name"].Value, p=> p.Groups["value"].Value );
foreach (var p in matches) {
    Console.WriteLine(p.Key + ": " + p.Value);
}

Выход:

-AppCode: MyApplication
-AppVers: V-2016.0 Debug
-MachUuid: 2C850880-34FD-12F3-A06B-7336B0C4BC55
-MachName: ABEZG-F05507
-Language: 2055
Другие вопросы по тегам