C# разбирает синтаксическую строку на компоненты

#c# #parsing #syntax #wpf-controls

#c# #разбор #синтаксис #wpf-элементы управления

Вопрос:

Я пытаюсь разобрать синтаксическую строку, что-то вроде:

Папка для копирования [-Источник] [-Цель] -Перезапись -Рекурсивный -Ошибка продолжения

и динамически добавляйте компоненты/элементы управления WPF в панель стека, чтобы запрашивать у пользователя ввод, например

 lt;StackPanelgt;  lt;TextBlock Text="-Source" /gt;  lt;TextBox Uid="-Source" /gt;  lt;TextBlock Text="-Target"/gt;  lt;TextBox Uid="-Target"/gt;  lt;CheckBox Uid="-Overwrite" Content="Overwrite"/gt;  lt;CheckBox Uid="-Recursive" Context="Recursive"/gt;  lt;TextBlock Text="-ContinueOnError"/gt;  lt;ComboBox Uid="-ContinueOnError"gt;  lt;ComboBoxItemgt;Truelt;/ComboBoxItemgt;  lt;ComboBoxItemgt;Falselt;/ComboBoxItemgt;  lt;/ComboBoxgt; lt;/StackPanelgt;  

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

 public static class StringExtensions {  public static string[] ParseArgs(this string source)  {  return Regex.Matches(source.Trim(), @"[""]. ?[""]|[']. ?[']|[lt;]. ?[gt;]|[[]. ?[]]|[{]. ?[}]|[^ ] ")  .Castlt;Matchgt;()  .Select(x =gt; x.Value)  .Where(x =gt; x.Length gt; 0)  .ToArray();  } }  

Обратите внимание, что, поскольку у-ContinueOnError есть после, он получает поле для ввода, где-Recursive-это флажок… ContinueOnError может быть null, true или false (укажите, если не null), где -Рекурсивный может быть только true или false (включить переключатель или исключить переключатель). Существует еще одна возможность комбинирования, которая представляет собой набор значений, следующих за переключателем, таких как:

Имя службы-Действие {Установка, Удаление, Запуск, Остановка}

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

ПРИМЕЧАНИЕ: XAML был набран и непроверен, не скопирован и не вставлен, пожалуйста, извините за опечатки и т.д.

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

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

2. Регулярное выражение, похоже, правильно анализирует аргументы… Я устал пытаться разобраться в этом и создал XML-файл для каждого элемента (их было 68) и использовал его вместо этого, к счастью, моему менеджеру больше понравилось решение XML, поскольку оно обеспечивало большую гибкость в будущем.

3. Хорошо, что вы нашли решение. Я заметил, что регулярное выражение разделило это -Arg {opt1 opt2} на две части, что может затруднить правильный анализ. Вы могли бы попробовать string.Split('-') и начать с этого, но, безусловно, конфигурация XML звучит намного надежнее и надежнее для этой относительно сложной и гибкой настройки.