web-dev-qa-db-fra.com

Extraction de chaîne C # RegEx

J'ai une ficelle:

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

Je dois extraire le premier nombre (chaîne "655") entre "ImageDimension =" et la première occurrence de "x"; et besoin d'extraire le deuxième nombre (chaîne "0") après le premier "x" après "ImageDimension =". Similaire avec les troisième et quatrième chiffres.

Cela peut-il être fait avec regex ("ImageDimension = ? x ?; ThumbnailDimension = ? x ?") et Comment ? Au lieu de sous-chaînes maladroites et indexof? Merci!

Ma solution qui n'est pas 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);
53
mishap

Cela va obtenir chacune des valeurs dans des entiers séparés pour vous:

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);
97
itsme86
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
L.B
var m = Regex.Match(str,@"(\d+).(\d+).*?(\d+).(\d+)");
m.Groups[1].Value; // 655 ....

(\d+) 

Obtenez le premier ensemble d'un ou plusieurs chiffres. et le stocker en tant que premier groupe capturé après tout le match

.

Correspondre à n'importe quel personnage

(\d+)

Obtenez la prochaine série d'un ou plusieurs chiffres. et le stocker en tant que deuxième groupe capturé après tout le match

.*? 

correspondance et nombre de caractères quelconques de manière non gourmande.

(\d+)

Obtenez la prochaine série d'un ou plusieurs chiffres. et le stocker en tant que troisième groupe capturé après le match entier

(\d+)

Obtenez la prochaine série d'un ou plusieurs chiffres. et le stocker en tant que quatrième groupe capturé après tout le match

9
rerun

Comme beaucoup de gens vous ont déjà donné ce que vous vouliez, je vais contribuer avec autre chose. Les expressions rationnelles sont difficiles à lire et sujettes aux erreurs. Peut-être un peu moins verbeux que votre implémentation mais plus simple et convivial que d'utiliser 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")));
    }
}
4
Bruno Brant