【问题标题】:Umbraco macro string into KeyValuePair将 Umbraco 宏字符串转换为 KeyValuePair
【发布时间】:2013-09-11 12:37:01
【问题描述】:

我有一个如下所示的字符串:

<?UMBRACO_MACRO redirectto="/sagen.aspx" loginpage="/Login.aspx" macroAlias="BrowserValidation" />

我想获取KeyValuePair&lt;string, string&gt; 的列表,其中键是第一部分,值是第二部分。一个例子是:

  • 键:重定向到值:/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 个命名捕获:

        1. key - 这必须以空格开头,并且可以是任意数量的字符,直到遇到第一个 ="
        2. - 在遇到下一个 " 之前,这将是任意数量的字符

        您的输出将是:

        key: redirectto  ||  value: /sagen.aspx 
        key: loginpage  ||  value: /Login.aspx
        key: macroAlias  ||  value: BrowserValidation
        

        希望这能解决问题!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-01
          • 2019-05-24
          • 2011-10-03
          • 1970-01-01
          • 2020-01-13
          • 1970-01-01
          • 2011-10-14
          • 2018-03-20
          相关资源
          最近更新 更多