none
Выделить пути из строки при помощи регулярного выражение RRS feed

  • Вопрос

  • Привет. Имеет такая строка: C:\folder1\picture1.jpg\C:\folder2\picture2.jpg\D:\folder3\p icture3.jpg\ ....
    Из этой строки надо по отдельности выделить имена файло с путями. 
    C:\folder1\picture1.jpg
    C:\folder2\picture2.jpg
    D:\folder3\picture3.jpg

    Прочитал что такое можно сделать при помощи регулярного выражение, но я сам в этом не разбираюсь. Накопал такое, которое показывает те значение которое мне нужно

    Regex reg = new Regex(@"(\w{1}:\\([A-z]|[0-9]|\s)+\.\w+)", RegexOptions.IgnoreCase);
                string s1 = @"C:\folder1\picture1.jpg\C:\folder2\picture2.jpg\D:\folder3\picture3.jpg\C:\folder1\picture1.jpg\";
     
                MatchCollection mc = reg.Matches(s1);
     
                foreach (Match mat in mc)
                {
                    listBox1.Items.Add(mat.ToString());
                }

    Но мне подсказали, что если в имени файла будет несколько точек, то мое выражение не даст нужного результата. 

    Два варианта решить эту проблему:

    1. Переделать выражение, чтоб оно показывало то что мне нужно и не обрашало внимание на то, какое имя файла ( с этим проблемы)

    2. При добавлении файла, проверять имя файла, если есть точка, то заменить его чем та, например "_"

    28 апреля 2013 г. 18:12

Ответы

  • Добрый день.

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

    static void Main(string[] args)
    {            
        string s1 = @"C:\fol_der1\picture1.jpg\C:\folder2\pict.ure2.jpg\D:\folder3\pict.ur.e3.jpg\C:\folder1\picture1.jpg\";
        List<string> results = GetFileNames(s1);
        foreach (var item in results)
        {
            Console.WriteLine(item);
        }
        Console.ReadKey();
    }
    
    private static List<string> GetFileNames(string s1)
    {
        List<string> results = new List<string>();
        while (s1.Contains(":"))
        {
            int index = s1.LastIndexOf(":") - 1;
            string fileName = s1.Substring(index);
            fileName = fileName.Remove(fileName.Length - 1);
            results.Add(fileName);
            s1 = s1.Remove(index);
        }
        return results;
    }

    Выполнение:

    • Помечено в качестве ответа Frech871 29 апреля 2013 г. 7:43
    29 апреля 2013 г. 6:44
    Отвечающий

Все ответы

  • А если в имени файла будет и "." и "_" и того и другого будет несколько штук. Что тогда?

    Не проще ли использовать методы класса Path? К примеру тот же GetDirectoryName, который может вернуть полный путь к директории где находится файл.

    28 апреля 2013 г. 22:06
  • А если в имени файла будет и "." и "_" и того и другого будет несколько штук. Что тогда?

    Не проще ли использовать методы класса Path? К примеру тот же GetDirectoryName, который может вернуть полный путь к директории где находится файл.

    неа, это не выход. И он мне на врят ли подходит. Так как у меня имеется файл, в котором в текстовом формате написано слияние несколько путей. Вот из этого мне надо выделить пути отдельно
    29 апреля 2013 г. 5:40
  • Добрый день.

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

    static void Main(string[] args)
    {            
        string s1 = @"C:\fol_der1\picture1.jpg\C:\folder2\pict.ure2.jpg\D:\folder3\pict.ur.e3.jpg\C:\folder1\picture1.jpg\";
        List<string> results = GetFileNames(s1);
        foreach (var item in results)
        {
            Console.WriteLine(item);
        }
        Console.ReadKey();
    }
    
    private static List<string> GetFileNames(string s1)
    {
        List<string> results = new List<string>();
        while (s1.Contains(":"))
        {
            int index = s1.LastIndexOf(":") - 1;
            string fileName = s1.Substring(index);
            fileName = fileName.Remove(fileName.Length - 1);
            results.Add(fileName);
            s1 = s1.Remove(index);
        }
        return results;
    }

    Выполнение:

    • Помечено в качестве ответа Frech871 29 апреля 2013 г. 7:43
    29 апреля 2013 г. 6:44
    Отвечающий
  • спасибо большое
    29 апреля 2013 г. 7:44