#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] !!)