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