Форматирование файлов с помощью Regex - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь разбить строку на несколько совпадений, каждое из которых содержит «имя», «атрибуты» и «файлы» (файлы применяются только к файлу с атрибутом каталога)

Строка, которую я пытаюсь отформатировать: (Я использую программу Hex-edit в качестве тестовой папки)

Hex Edit\ 1pÝó/Õ\<changelog.txt\ RÖ©òó/Õ ð`s7bÆÔ%ªòó/Õ        <      \HxD32.exe\ %ovòó/Õ ð‚fNcÆÔ­ÿ—òó/Õ<      Þ     \HxD64.exe\ ¤M˜òó/Õ ð‚fNcÆÔ:Ùžòó/Õ)     †e"     \license.txt\ “Lªòó/Õ ðõhÿªÔ“Lªòó/Õ¯?     c      \readme.txt\ ·&Ÿòó/Õ ðËóyÿªÔp°©òó/Õ„?     ¦
      \Settings\ IRýòó/Õ\<HxD Hex Editor.ini\ ÉÌ"ô/Õ ôeìÔ)3ÖôeìÔ)3Ö¸Ž?     õ      \HxD Hex Editor.lang\ yýòó/Õ yýòó/Õyýòó/Õ­•?     ”       \>>

В настоящее время я использую (?<name>.+?)\\(?<attributes>.{10}( .{32})*?)\\(?<files>(<(?:[^<>]*|(?<open>\<)|(?<-open>\>))+(?(open)(?!))>)*)

Способ форматирования файла:

имя файла \ атрибуты \ файлы

атрибуты могут иметь значение .{10}\s.{32} или .{10}, за которым следует \.

Не всегда файлы, но если есть, то файлы будут < + больше файлов (рекурсивно, может go до бесконечности) + >.

То, что я надеялся, это Regex ответит:

Name: Hex Edit
Attributes:  1pÝó/Õ
Files: <changelog.txt\ RÖ©òó/Õ ð`s7bÆÔ%ªòó/Õ        <      \HxD32.exe\ %ovòó/Õ ð‚fNcÆÔ­ÿ—òó/Õ<      Þ     \HxD64.exe\ ¤M˜òó/Õ ð‚fNcÆÔ:Ùžòó/Õ)     †e"     \license.txt\ “Lªòó/Õ ðõhÿªÔ“Lªòó/Õ¯?     c      \readme.txt\ ·&Ÿòó/Õ ðËóyÿªÔp°©òó/Õ„?     ¦
      \Settings\ IRýòó/Õ\<HxD Hex Editor.ini\ ÉÌ"ô/Õ ôeìÔ)3ÖôeìÔ)3Ö¸Ž?     õ      \HxD Hex Editor.lang\ yýòó/Õ yýòó/Õyýòó/Õ­•?     ”       \>>

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

Я пытаюсь это сделать чуть больше двух часов, но до сих пор не получил otten немного ближе с моей текущей попыткой (?<name>[^\\/:*?<>"|]+?)\\(?<attributes>.{10}( .{32})*?)\\(?<files>\<(?>\<(?<c>)|[^<>]+|\>(?<-c>))*(?(c)(?!))\>).

Regex должен быть. net совместимым.

Извините за плохое объяснение, я не уверен, как это сказать, а также это это мой первый пост.

1 Ответ

0 голосов
/ 27 мая 2020

Попробуйте следующее:

            string input = File.ReadAllText(FILENAME);
            string pattern = @"^(?'name'[^\\]+)\\(?'attribute'[^\\]+)\\(?'files'.*)";

            Match match = Regex.Match(input,pattern);

            string name = match.Groups["name"].Value;
            string attribute = match.Groups["attribute"].Value;
            string files = match.Groups["files"].Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...