Я пытаюсь написать регулярное выражение для сопоставления и разбить синтаксис пользовательской переменной в C #. Идея здесь заключается в пользовательском форматировании строковых значений, очень похожих на стиль форматирования строк в .NET String.Format / {0}.
Например, пользователь может определить формат строки для оценки во время выполнения, например:
D:\Path\{LanguageId}\{PersonId}\
Значение 'LanguageId' соответствует полю объекта данных, и его текущее значение заменяется.
Ситуация усложняется, когда необходимо передать аргументы в поле форматирования. Например:
{LanguageId:English|Spanish|French}
Это имело бы смысл выполнения некоторой условной логики, если бы значение «LanguageId» было равно одному из аргументов.
Наконец, мне нужно будет поддерживать аргументы карты, например:
{LanguageId:English=>D:\path\english.xml|Spanish=>D:\path\spansih.xml}
Вот перечисление всех возможных значений:
Команда без аргумента :
сделать что-то особенное
{@Date}
Один аргумент команды:
{@Date:yyyy-mm-dd}
Без аргументов:
{LanguageId}
Один список аргументов:
{LanguageId:English}
Multi-Argument-list:
{LanguageId:English|Spanish}
Карта одного аргумента:
{LanguageId:English=>D:\path\english.xml}
Мульти Аргумент-карта:
{LanguageId:English=>D:\path\english.xml|Spanish=>D:\path\spansih.xml}
Сводка: синтаксис можно свести к ключу с необязательным списком типов параметров или картой (не обоими).
Ниже приведено Regex, в котором у меня есть несколько проблем, а именно, он не обрабатывает все пробелы правильно, в .NET я не получаю ожидаемые расщепления. Например, в первом примере мне возвращают одно совпадение '{LanguageId} {PersonId}' вместо двух разных совпадений. Также я уверен, что он не обрабатывает путь к файловой системе или строки с разделителями в кавычках. Буду признателен за любую помощь в преодолении горба. Или любые рекомендации.
private const string RegexMatch = @"
\{ # opening curly brace
[\s]* # whitespace before command
@? # command indicator
(.[^\}\|])+ # string characters represening command or metadata
( # begin grouping of params
: # required param separater
( # begin select list param type
( # begin group of list param type
.+[^\}\|] # string of characters for the list item
(\|.+[^\}\|])* # optional multiple list items with separator
) # end select list param type
| # or select map param type
( # begin group of map param type
.+[^\}\|]=>.+[^\}\|] # string of characters for map key=>value pair
(\|.+[^\}\|]=>.+[^\}\|])* # optional multiple param map items
) # end group map param type
) # end select map param type
) # end grouping of params
? # allow at most 1 param group
\s*
\} # closing curly brace
";