Google AdvancedSearch-подобное регулярное выражение C #

#c# #regex

#c# #регулярное выражение

Вопрос:

Я пытаюсь написать — безуспешно — регулярное выражение, способное извлекать критерии фильтрации из строки, например:

 String rawFilter = "field1: something field3: something else field2: any number of words";
  

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

Обновление, как указано в комментарии. Насколько я знаю о регулярных выражениях, первым результатом может быть массив с именами полей в четных позициях и значением в нечетных позициях. Так что:

 Console.WriteLine(matches[0]); //Prints field1
Console.WriteLine(matches[1]); //Prints something 
Console.WriteLine(matches[2]); //Prints field3
Console.WriteLine(matches[3]); //Prints something else
Console.WriteLine(matches[4]); //Prints field2
Console.WriteLine(matches[5]); //Prints any number of words
  

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

1. Какой результат вы ожидаете?

2. Должно быть массивом с именами полей в нечетных позициях и значениями в четных позициях.

3. Опубликуйте регулярное выражение, которое у вас есть в данный момент.

Ответ №1:

Имя поля находится в группе 1, а значение — в группе 2:

 Regex r = new Regex(@"(fieldd:)s*((?:(?!field).)*)");
            int i = 0;
            foreach (Match m in r.Matches("field1: something field3: something else field2: any number of words")) {
                Console.WriteLine(  i);
                Console.WriteLine("{0} -{1}", 1, m.Groups[1].Value);
                Console.WriteLine("{0} -{1}", 2, m.Groups[2].Value);
            }
  

С принтами:

 1
1 -field1:
2 - something 
2
1 -field3:
2 - something else 
3
1 -field2:
2 - any number of words
  

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

1. 1, но несколько небольших комментариев. Крайние скобки не нужны. Я бы использовал группы без захвата, чтобы результат был в группах 1 и 2, и я бы удалил пробелы перед второй группой. Так что я думаю, что это (fieldd:)s*((?:(?!field).)*) было бы небольшим улучшением (результат тогда в группах [1] и [2] !!)