2014-10-13 2 views
0

я следующие типы путей строка файла:Finding C# Регулярное выражение

const string s1 = "~/somestring/somestring/somestring/somestring/somestring/someName_987x3474.png"; 
const string s2 = "~/somestring/somestring/somestring/someOtherName_222x666.png"; 
const string s3 = "~/somestring/somestring/somestring/somestring/someName_9871x3474_someString.png"; 

Теперь у нас уже есть регулярное выражение, которое может найти ширину изображения для строки s1 и s2 (987 и 222). Это:

var regex = new Regex(@"(?i)[^/]*?(?<width>\d+)x\d+\..*$"); 

Это верно работает для первых двух строк, и я могу получить ширину позже. Но для третьей строки это не получается. Известно, что пути будут иметь любую длину и будет иметь имя файла в следующем формате:

someString_someNumberxsomeNumber.someextension ИЛИ someString_someNumberxsomeNumber_someString.someextension

В настоящее время мое регулярное выражение работает только для первого сценария.

Я позже сделать что-то вроде этого:

var v = filePaths.Select(f => regex.Match(f)).Where(m => (m.Success || !m.Success)) 
        .Select(m => new MyClass 
        { 
         FileUrl = m.Value, 
         Width = int.Parse(m.Groups["width"].Value, CultureInfo.InvariantCulture), 
        }) 
        .OrderBy(t => t.Width); 

MyClass содержит только два свойства FileUrl и Width. Здесь FileUrl или m.Value должно быть именем файла, то есть всей строки после последнего/в исходном пути и ширины, должен A в AxB. Например - 987, 222 или 9871.

Спасибо.

+0

Ваше регулярное выражение соответствие «# х #.» что означает, что это будет соответствовать только на линиях, где вы видите одну или несколько цифр, за которой следует x, за которым следует одна или несколько цифр, за которой следует период. Я подозреваю, что вы хотите попытаться посмотреть только те части, которые содержат 987x3474, чтобы получить размеры, но ваша цель не совсем ясна для меня. – chsh

+0

Сделайте точку опциональной. http://regex101.com/r/xH3iL5/3 или поставить * перед точкой http://regex101.com/r/xH3iL5/4 –

+0

@Avinash - он падает, когда я пытаюсь получить список объектов MyClass, говорящих - Строка ввода не была в правильном формате. – VVV

ответ

2

Похоже, вы могли бы просто использовать Path.GetFileName и использовать более простое регулярное выражение этого результата:

var regex = new Regex(@"(?<width>\d+)x\d+"); 

var v = filePaths 
      .Select(f => regex.Match(Path.GetFileName(f))) 
      .Where(m => (m.Success || !m.Success)) 
      .Select(m => new MyClass 
      { 
       FileUrl = m.Value, 
       Width = int.Parse(m.Groups["width"].Value, CultureInfo.InvariantCulture), 
      }) 
      .OrderBy(t => t.Width); 
+0

Извините одну ошибку. m.Value должно быть именем файла (целая строка после последнего/в исходном пути). Я изменил это сейчас и в моем вопросе, и в конце. – VVV

+0

@VVV: Я вижу, я обновлю ответ –

+0

@VVV: Если я правильно понял, вы должны использовать вместо этого 'GetFileName'. Дай мне знать, если это работает. –

Смежные вопросы