C# RegEx string extraction

C#RegexString

C# Problem Overview


I have a string:

> "ImageDimension=655x0;ThumbnailDimension=0x0".

I have to extract first number ("655" string) coming in between "ImageDimension=" and first occurrence of "x" ; and need extract second number ("0" string) coming after first "x" occurring after "ImageDimension=" string. Similar with third and fourth numbers.

Can this be done with regex ("ImageDimension=? x ?;ThumbnailDimension=? x ?") and how ? Instead of clumsy substrings and indexof ? Thank you!

My solution which is not nice :

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

C# Solutions


Solution 1 - C#

This will get each of the values into separate ints for you:

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

Solution 2 - C#

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;

Solution 3 - C#

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

(\d+) 

Get the first set of one or more digits. and store it as the first captured group after the entire match

.

Match any character

(\d+)

Get the next set of one or more digits. and store it as the second captured group after the entire match

.*? 

match and number of any characters in a non greedy fashion.

(\d+)

Get the next set of one or more digits. and store it as the third captured group after the entire match

(\d+)

Get the next set of one or more digits. and store it as the fourth captured group after the entire match

Solution 4 - C#

Since a lot of people already gave you what you wanted, I will contribute with something else. Regexes are hard to read and error prone. Maybe a little less verbose than your implementation but more straightforward and friendly than using regex:

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

Solution 5 - C#

Sure, it's pretty easy. The regex pattern you're looking for is:

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

The first group in the match is the number you want.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmishapView Question on Stackoverflow
Solution 1 - C#itsme86View Answer on Stackoverflow
Solution 2 - C#L.BView Answer on Stackoverflow
Solution 3 - C#rerunView Answer on Stackoverflow
Solution 4 - C#Bruno BrantView Answer on Stackoverflow
Solution 5 - C#Stephen GrossView Answer on Stackoverflow