【问题标题】:C# RegEx string extractionC# RegEx 字符串提取
【发布时间】:2012-02-24 18:54:33
【问题描述】:

我有一个字符串:

“图像尺寸=655x0;缩略图尺寸=0x0”。

我必须提取介于 "ImageDimension=" 和第一次出现 "x" 之间的第一个数字("655" 字符串); 并且需要在“ImageDimension=”字符串之后的第一个“x”之后提取第二个数字(“0”字符串)。与第三个和第四个数字类似。

这可以用正则表达式完成吗 ("ImageDimension=? x ?;ThumbnailDimension=? x ? “) 如何 ?而不是笨拙的子字符串和 indexof ?谢谢!

我的解决方案不好:

String configuration = "ImageDimension=655x0;ThumbnailDimension=0x0";
String imageDim = configuration.Substring(0, configuration.IndexOf(";"));
int indexOfEq = imageDim.IndexOf("=");
int indexOfX = imageDim.IndexOf("x");

String width1 = imageDim.Substring(indexOfEq+1, indexOfX-indexOfEq-1);
String height1 = imageDim.Substring(imageDim.IndexOf("x") + 1);

String thumbDim = configuration.Substring(configuration.IndexOf(";") + 1);
indexOfEq = thumbDim.IndexOf("=");
indexOfX = thumbDim.IndexOf("x");

String width2 = imageDim.Substring(indexOfEq + 1, indexOfX - indexOfEq-1);
String height2 = imageDim.Substring(imageDim.IndexOf("x") + 1);

【问题讨论】:

  • 顺便说一句:如果没有正则表达式,您也可以使用 string.Split() 使其不那么难看。

标签: c# regex string


【解决方案1】:

这将为您将每个值转换为单独的整数:

string text = "ImageDimension=655x0;ThumbnailDimension=0x0";
Regex pattern = new Regex(@"ImageDimension=(?<imageWidth>\d+)x(?<imageHeight>\d+);ThumbnailDimension=(?<thumbWidth>\d+)x(?<thumbHeight>\d+)");
Match match = pattern.Match(text);
int imageWidth = int.Parse(match.Groups["imageWidth"].Value);
int imageHeight = int.Parse(match.Groups["imageHeight"].Value);
int thumbWidth = int.Parse(match.Groups["thumbWidth"].Value);
int thumbHeight = int.Parse(match.Groups["thumbHeight"].Value);

【讨论】:

  • 您还可以使用以下模式使搜索更加通用:@"(?&lt;imageWidth&gt;\d+).(?&lt;imageHeight&gt;\d+).*?(?&lt;thumbWidth&gt;\d+).(?&lt;thumbHeight&gt;\d+)"
  • 这里有什么我们应该注意的例外吗?
【解决方案2】:
var groups = Regex.Match(input,@"ImageDimension=(\d+)x(\d+);ThumbnailDimension=(\d+)x(\d+)").Groups;
var x1= groups[1].Value;
var y1= groups[2].Value;
var x2= groups[3].Value;
var y2= groups[4].Value;

【讨论】:

    【解决方案3】:
    var m = Regex.Match(str,@"(\d+).(\d+).*?(\d+).(\d+)");
    m.Groups[1].Value; // 655 ....
    

    (\d+) 
    

    获取第一组一个或多个数字。并将其存储为整个比赛后的第一个捕获组

    .
    

    匹配任意字符

    (\d+)
    

    获取下一组一个或多个数字。并将其存储为整个比赛后的第二个捕获组

    .*? 
    

    以非贪婪的方式匹配任何字符的数量。

    (\d+)
    

    获取下一组一个或多个数字。并将其存储为整场比赛后的第三个捕获组

    (\d+)
    

    获取下一组一个或多个数字。并将其存储为整场比赛后的第四个捕获组

    【讨论】:

      【解决方案4】:

      由于很多人已经给了你想要的东西,我会贡献一些别的东西。正则表达式难以阅读且容易出错。可能比您的实现更简洁,但比使用正则表达式更直接和友好:

      private static Dictionary<string, string> _extractDictionary(string str)
      {
          var query = from name_value in str.Split(';')   // Split by ;
                      let arr = name_value.Split('=')     // ... then by =
                      select new {Name = arr[0], Value = arr[1]};
      
          return query.ToDictionary(x => x.Name, y => y.Value);
      }
      
      public static void Main()
      {
          var str = "ImageDimension=655x0;ThumbnailDimension=0x0";
          var dic = _extractDictionary(str);
      
          foreach (var key_value in dic)
          {
              var key = key_value.Key;
              var value = key_value.Value;
              Console.WriteLine("Value of {0} is {1}.", key, value.Substring(0, value.IndexOf("x")));
          }
      }
      

      【讨论】:

        【解决方案5】:

        当然,这很容易。您正在寻找的正则表达式模式是:

        ^ImageDimension=(\d+)x0;.+$
        

        匹配的第一组是你想要的号码。

        【讨论】:

          猜你喜欢
          • 2014-06-24
          • 2017-04-08
          • 1970-01-01
          • 2019-03-14
          • 2023-01-07
          • 2017-12-10
          • 2020-06-10
          • 2011-06-26
          • 1970-01-01
          相关资源
          最近更新 更多