C#正则表达式字符串提取

71
我有一个字符串:
"ImageDimension=655x0;ThumbnailDimension=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);

2
作为一个随机的旁注:你也可以不使用正则表达式,而是使用string.Split()来使它看起来更加美观。 - Stu
5个回答

127

这将为您获取每个值的单独整数:

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);

2
您可以使用以下模式使搜索更通用:@"(?<imageWidth>\d+).(?<imageHeight>\d+).*?(?<thumbWidth>\d+).(?<thumbHeight>\d+)" - That Chuck Guy
这里有任何例外情况需要注意吗? - whossname

21
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;

13
var m = Regex.Match(str,@"(\d+).(\d+).*?(\d+).(\d+)");
m.Groups[1].Value; // 655 ....

(\d+) 

获取第一个由一或多个数字组成的集合,将其作为整个匹配后的第一个捕获组存储。

.

匹配任意字符

(\d+)

获取下一组一个或多个数字,并将其作为整个匹配后的第二个捕获组存储。

.*? 

以非贪婪的方式匹配任意字符及其数量。

(\d+)

获取下一组一个或多个数字,并将其存储为完整匹配后的第三个捕获组。

(\d+)

获取下一组一个或多个数字,并将其作为整个匹配后第四个捕获组存储。


6

既然已经有很多人给你想要的东西了,我来贡献一些其他的内容。正则表达式难以阅读且容易出错。也许比您的实现略少冗长,但比使用正则表达式更直接和友好:

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")));
    }
}

-2

当然,这很容易。你要找的正则表达式模式是:

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

匹配中的第一组是您想要的数字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接