我正在尝试编写一个正则表达式来匹配和拆分 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}
多参数列表:
{LanguageId:English|Spanish}
单参数映射:
{LanguageId:English=>D:\path\english.xml}
多参数映射:
{LanguageId:English=>D:\path\english.xml|Spanish=>D:\path\spansih.xml}
摘要:语法可以归结为带有可选参数类型列表或映射(不是两者)的键。
下面是我到目前为止的正则表达式,它有一些问题,即它不能正确处理所有空格,在 .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
";