Выделение строки С#
У меня есть строка:
"ImageDimension = 655x0; ThumbnailDimension = 0x0".
Мне нужно извлечь первое число (строка "655" ), находящееся между "ImageDimension =" и первым появлением "x";
и нужно извлечь второе число (строка "0" ), появившееся после первого "x", следующего за строкой "ImageDimension =". Аналогично третьему и четвертому номерам.
Можно ли это сделать с помощью регулярного выражения ( "ImageDimension = ? x ?; ThumbnailDimension = ? x ?" ) и как? Вместо неуклюжих подстрок и индекса? Спасибо!
Мое решение, которое не приятно:
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);
Ответы
Ответ 1
Это приведет к получению каждого из значений в отдельные int для вас:
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
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
Поскольку многие люди уже дали вам то, что вы хотели, я буду способствовать чему-то еще. Regexes трудно читать и подвержены ошибкам. Может быть, немного менее подробный, чем ваша реализация, но более простой и дружелюбный, чем использование регулярного выражения:
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;.+$
Первая группа в матче - это номер, который вы хотите.