Извлечение значения в квадратных скобках в другой квадратной скобке на основе ключа - PullRequest
1 голос
/ 31 мая 2019

У меня есть данные как ниже, откуда мне нужно извлечь данные по ключу.

string filter=[[LUB,=,COMMERCIAL],AND,[Pgm,=,PRIVATE],AND,[Regn,=,Rasna],AND,[Month,=,06],AND,[Year,=,2018],AND,[Bywhat,=,M]]

Я проверил подобные случаи и смог получить только код, который не дает результатов на основе ключа

Я пытался

Regex.Match(filter, @"\[(.*?)\]") 

если я дам Regn, мне нужно получить Rasna

и если я дам LUB, он должен дать COMMERCIAL и так

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Попробуйте следующее:

            string filter="[[LUB,=,COMMERCIAL],AND,[Pgm,=,PRIVATE],AND,[Regn,=,Rasna],AND,[Month,=,06],AND,[Year,=,2018],AND,[Bywhat,=,M]]";

            string pattern = @"\[(?'key'\w+),=,(?'value'[^\]]+)";

            MatchCollection matches = Regex.Matches(filter, pattern);

            foreach (Match match in matches.Cast<Match>())
            {
                Console.WriteLine("Key : '{0}', Value : '{1}'", match.Groups["key"].Value, match.Groups["value"].Value);
            }
            Console.ReadLine();
            Dictionary<string, string> dict = matches.Cast<Match>().GroupBy(x => x.Groups["key"].Value, y => y.Groups["value"].Value)
               .ToDictionary(x => x.Key, y => y.FirstOrDefault());
1 голос
/ 31 мая 2019

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

(?<=\[Regn,=,)[^]\r\n]+(?=\])

Пояснение

  • (?<=\[Regn,=,)
  • [^]\r\n]+ Класс отрицательных символов, не соответствует ] или символу новой строки (Добавьте то, что вы также не хотите совпадать (
  • (?=\]) Утвердите, что справа]

См. Демонстрационную версию .NET regex или C # DEMO

string[] strings = { "LUB", "Pgm", "Regn", "Month", "Year", "Bywhat" };

foreach (string s in strings)
{
    string filter = @"[[LUB,=,COMMERCIAL],AND,[Pgm,=,PRIVATE],AND,[Regn,=,Rasna],AND,[Month,=,06],AND,[Year,=,2018],AND,[Bywhat,=,M]]";
    string pattern = string.Format(@"(?<=\[{0},=,)[^]\r\n]+(?=\])", s);
    var m = Regex.Match(filter, pattern);
    Console.WriteLine(m.Value);
}

Результат

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