powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / В имени файла выделить часть, соответствующей шаблону
8 сообщений из 8, страница 1 из 1
В имени файла выделить часть, соответствующей шаблону
    #39932971
Degun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из некоторой директории в соответствии с шаблоном я получаю список находящихся там файлов. Из имени каждого файла необходимо выделить ту часть, которая соответствует символу * в шаблоне. Например, из имени файла "0099600_RPTCLIENTS_001_280220_000387186.xml" необходимо получить "280220_000387186". Как это реализовать?
Код: c#
1.
2.
3.
4.
5.
6.
      string sFullNameDir = @"D:\Temp\0099600_RPTCLIENTS_001_*.xml";
      string[] pFilesList = Directory.GetFiles(Path.GetDirectoryName(sFullNameDir), Path.GetFileName(sFullNameDir));
      foreach(string sFileName in pFilesList)
      {
        string sPartName = sFileName ... ?
      }
...
Рейтинг: 0 / 0
В имени файла выделить часть, соответствующей шаблону
    #39932978
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из имени файла убери 23 первых символа и 4 последних
...
Рейтинг: 0 / 0
В имени файла выделить часть, соответствующей шаблону
    #39932982
Degun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,
Нужно более универсальное решение, т. к. знак * может быть в любом месте шаблона. Кроме того, их может быть несколько.
...
Рейтинг: 0 / 0
В имени файла выделить часть, соответствующей шаблону
    #39932983
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в wildcard для ms\pc-dos и винды в шаблоне вроде 2 символа подстановочных, это * (любые символы в любом количестве) и ? (любой одиночный символ)
то есть, достаточно разбить строку шаблон по этим символам, чтоб получить те строки, по которым осуществляется выборка.
затем в искомой строке нужно найти эти подстроки.
Как их выделить в WinForms я понятия не имею, в WPF это делает на раз-два

Еще проще, берем строку WildCard шаблон и делаем из неё RegEx шаблон, * заменяем на (.*), ? заменяем на (.?), всё остальное заносим в группы.
в результате вы получите "карту" по группам
для шаблона: 'D:\Temp\0099600_?_RPTCLIENTS_001_*.xml'

с RegEx удобнее всего, количество подстановчных символов и их положение не имеет значение. Всё, что нужно, это просто взять полученные группы и добавить их в TextBlock в виде Run объект с заданным форматированием (в WPF). Или отрендерить в WPF в виде последовательного текста с разным форматированием (или как это у вас там делается)
...
Рейтинг: 0 / 0
В имени файла выделить часть, соответствующей шаблону
    #39932996
Degun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,
Спасибо. RegEx как вариант подходит, но нужно опять же модифицировать шаблон, т. е. делать его анализ и менять его в соответствии с его структурой.
Есть ли способ, который позволяет решить задачу без модификации шаблона и не привязываясь к визуальной части той или иной платформы (WinForms, WPF and etc.)?
...
Рейтинг: 0 / 0
В имени файла выделить часть, соответствующей шаблону
    #39933017
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Degun,

что там модифицировать то?
1. Экранируйте все символы в шаблоне через метод string Regex.Escape(string)
2. Добавляете в начало строки начало первой группы '(', в конец строки конец последней группы ')'
3. Заменяете все вхождения "\*" (экранированный *) на ")(.*)(" и все "\?" на ")(.?)("

Вот и все замены, это можно делать налету, вы не "модифицируйте" шаблон, а просто генерируйте на основе WildCard шаблона соответствующий ему RegEx шаблон.
Вам не нужно модифицировать существующие шаблоны, вам нужно генерировать на основе существующих свой.
Это должно быть инкапсулировано, то есть конечный пользователь вообще не должен знать, что там какой то Regex используется.
Он просто создает объект класса, передает в конструкторе шаблон Wildcard и потом дёргает метод класса и получает то, что вы хотели.
А то, что происходит внутри, его не касается. Для него всё будет работать через Wildcard, а не через Regex
...
Рейтинг: 0 / 0
В имени файла выделить часть, соответствующей шаблону
    #39933083
Degun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,
Сделал по методике. Код ниже в строке sTestString должен получить "TestString". Но в результате получается пустая строка. Что не так?
Код: c#
1.
2.
3.
4.
5.
6.
      string sFilePattern = @"0099600_RPTCLIENTS_001_*.xml";
      string sFileName = sFilePattern.Replace("*", "TestString");
      Regex myRegex = new Regex("(" + Path.GetFileName(sFilePattern).Replace("*", ")(.*)(") + ")");
      string sTestString = myRegex.Match(Path.GetFileName(sFileName), 0).Result("");
      //В sTestString пусто
      Console.WriteLine(sTestString);
...
Рейтинг: 0 / 0
В имени файла выделить часть, соответствующей шаблону
    #39933142
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Degun,

потому, что читайте невнимательно то, что вам пишут
я же все шаги расписал по пунктам
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
class Program
{
    internal const string WildStar = "WildStar";
    internal const string WildQuestion = "WildQuestion";
    static void Main(string[] args)
    {

        const string sFilePattern = @"0099600_?_RPTCLIENTS_001_*.xml";
        const string sFileName = @"0099600_#_RPTCLIENTS_001_StarString.xml";
        Console.WriteLine($"Pattern: {sFilePattern}");
        Console.WriteLine($"Filename: {sFileName}");
        string escapePatter = Regex.Escape(sFilePattern); //1
        string regExPattern = "(" 
            + escapePatter
            .Replace(@"\*", $")(?<{WildStar}>.*)(")
            .Replace(@"\?", $")(?<{WildQuestion}>.?)(")
            + ")"; //2 + 3
        Regex regex = new Regex(regExPattern);
        GroupCollection groups = regex.Match(Path.GetFileName(sFileName), 0).Groups;
        for (int i = 1; i < groups.Count; i++)
        {
            Group grp = groups[i];
            if (grp.Success && !string.IsNullOrEmpty(grp.Value))
            {
                string name = regex.GroupNameFromNumber(i);
                SetColor(name);
                Console.WriteLine($"{name}:{grp.Value}");
            }
        };
        Console.ReadKey();
    }
    static void SetColor(string name)
    {
        switch (name)
        {
            case WildStar:
            case WildQuestion:
                Console.ForegroundColor = ConsoleColor.Yellow;
                break;
            default:
                Console.ForegroundColor = ConsoleColor.Gray;
                break;
        }
    }
}


[/img]
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / В имени файла выделить часть, соответствующей шаблону
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]