【问题标题】:Umbraco macro string into KeyValuePair将 Umbraco 宏字符串转换为 KeyValuePair
【发布时间】:2013-09-11 12:37:01
【问题描述】:
我有一个如下所示的字符串:
<?UMBRACO_MACRO redirectto="/sagen.aspx" loginpage="/Login.aspx" macroAlias="BrowserValidation" />
我想获取KeyValuePair<string, string> 的列表,其中键是第一部分,值是第二部分。一个例子是:
- 键:重定向到值:/sagen.aspx
- 键:loginpage 值:/Login.aspx
- 键:macroAlias 值:BrowserValidation
我正在考虑使用正则表达式,但老实说我不知道从哪里开始。我知道我可以使用\"(.*?)\" 来获取值,但我不知道如何获取密钥。
【问题讨论】:
标签:
c#
regex
macros
umbraco
【解决方案1】:
你可以试试下面的正则表达式:
(?<=\s)([^=]+)="([^"]+)"
这是 C# 中的代码:
var input = @"<?UMBRACO_MACRO redirectto=""/sagen.aspx"" loginpage=""/Login.aspx"" macroAlias=""BrowserValidation"" />";
var matches = Regex.Matches(input, @"(?<=\s)([^=]+)=""([^""]+)""");
foreach (Match match in matches) {
Console.Write(match.Groups[1].Value);
Console.Write(" : ");
Console.WriteLine(match.Groups[2].Value);
}
这是前面代码的更紧凑版本,它自动将属性名称和值对映射到字典:
var input = @"<?UMBRACO_MACRO redirectto=""/sagen.aspx"" loginpage=""/Login.aspx"" macroAlias=""BrowserValidation"" />";
var matches = Regex.Matches(input, @"(?<=\s)([^=]+)=""([^""]+)""");
var dictionary = matches.Cast<Match>()
.Select( m => new {Key = m.Groups[1].Value, Value = m.Groups[2].Value } )
.ToDictionary(pair => pair.Key, pair => pair.Value);
Console.WriteLine(dictionary);
Regex101 Demo
【解决方案2】:
怎么样:
static void Main()
{
string stringToSearch = @"<?UMBRACO_MACRO redirectto=""/sagen.aspx"" loginpage=""/Login.aspx"" macroAlias=""BrowserValidation"" />";
string pattern = @"\s(\S+)=""(.+?)""";
var matches = Regex.Matches( stringToSearch, pattern );
foreach( Match match in matches )
{
Console.WriteLine( "Key: " + match.Groups[1].ToString() + ". Value: " + match.Groups[2].ToString() );
}
}
输出:
键:重定向到。值:/sagen.aspx
键:登录页面。值:/Login.aspx
键:宏别名。值:浏览器验证
地点:
- \s 是空格
- \S 是非空格(假设键中没有空格)
- + 为 1 或更多。
- .+?意味着懒惰而不是贪婪地匹配。
- () 表示组,稍后在迭代组时引用。
【解决方案3】:
...试试这个:
\s(?<key>.*?)\=\"(?<value>.*?)\"
基本上,这将为您提供 2 个命名捕获:
-
key - 这必须以空格开头,并且可以是任意数量的字符,直到遇到第一个
="
-
值 - 在遇到下一个
" 之前,这将是任意数量的字符
您的输出将是:
key: redirectto || value: /sagen.aspx
key: loginpage || value: /Login.aspx
key: macroAlias || value: BrowserValidation
希望这能解决问题!