2013-12-11 6 views
0

Я почти новичок в регулярном выражении. Я пытаюсь разобрать выходы из CommandLineInterface (CLI). Обычно вывод состоит из содержимого файлов и папок по указанному пути. Следующие могут быть потенциальными различными форматами вывода.Регуляция регулярных выражений многострочной записи с необязательными символами новой строки

CLI Выходного формат 1

d:\ARCTest\_MyProject\Sources\CMCore\project.pj subsandbox <CRLF> 
<space> d:\ARCTest\_MyProject\Sources\CMInterfaces\project.pj subsandbox <CRLF> 
<space> d:\ARCTest\_MyProject\Sources\CMImplementation\project.pj subsandbox <CRLF> 
<space> d:\ARCTest\_MyProject\Sources\Übersicht und fragen\project.pj subsandbox <CRLF> 
<space> d:\ARCTest\_MyProject\Sources\CMAccess.sln archived 1.15 <CRLF> 
<space> d:\ARCTest\_MyProject\Sources\übersicht und fragen.xlsx archived 1.1 

Для формата 1, до второй линии вперед есть CRLF и капельное пространство (я обозначил это, используя символы <space> и <CRLF> Пожалуйста, обратите внимание, что это не часть фактического выхода). CRLF может не всегда присутствовать на выходе, другими словами, он является необязательным. Первые четыре - это пути к папкам mks, а последние два - файлы в mks. То, что я хочу, это все совпадения, указывающие на папки (те, которые заканчиваются в \ project.pj, включая project.pj), и соответствует этой точке в файлах (те, которые заканчиваются словом, заархивированным, за исключением архивированного текста).

Формата CLI Выход 2

CMCore/project.pj subproject <CRLF> 
CMInterfaces/project.pj subproject <CRLF> 
CMImplementation/project.pj subproject <CRLF> 
Übersicht und fragen/project.pj subproject <CRLF> 
CMAccess.sln archived <CRLF> 
übersicht und frögen.xlsx archived 

Для формата 2 до второй строки и далее есть CRLF (я обозначил это с помощью символа, пожалуйста, обратите внимание, что это не является частью фактического выпуска продукции). Первые четыре - это пути к папкам mks, а последние два - файлы в mks. То, что я хочу, это все совпадения, указывающие на папки (те, которые заканчиваются в \ project.pj, включая project.pj), и соответствует этой точке в файлах (те, которые заканчиваются словом, заархивированным, за исключением архивированного текста).

Я был почти успешным для анализа папок в обоих случаях с использованием выражения rgular ^([^\r\n]\w+.+?\.pj), но он не смог получить первую строку из выходного формата 1. Я не смог найти решение для анализа файлов в обоих форматы. Любое решение могло бы оказать большую помощь.

Пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию об этом.

Заранее благодарен, Joe.

+0

У вас есть много потенциальных проблем с использованием некотируемые имен путей, которые содержат пробелы. Например, у вас будет очень трудное время с пути 'd: \ ARCTest \ _MyProject \ Sources \ this.pj - mess \ project.pj'. Можете ли вы изменить свой вывод, чтобы указать имена путей? –

+0

@JimMischel Такой путь никогда не появится, так как я сказал, что эти записи читаются из CLI. Это пути к файлам и папкам, хранящимся на сервере MKS. Расширение .pj - это расширение по умолчанию, которое MKS использует для указания папки. –

ответ

0

Попробуйте это:

([\w ]\S+\/*)*\w([\w]+\.(\w+)) 

using System; 
using System.Text.RegularExpressions; 

public class Test 
{ 
    public static void Main() 
    { 
     string patternDir = @"([\w ]\S+\/*)*\w([\w]+\.(pj))"; 

     string pathDir = @"d:\ARCTest\_MyProject\Sources\CMInterfaces\project.pj subsandbox "; 
     string pathFile = @"CMAccess.sln archived"; 

     Console.WriteLine((Regex.IsMatch(pathDir,patternDir))? "It's dir!" : "It's not a dir"); 
     Console.WriteLine((Regex.IsMatch(pathFile,patternDir))? "It's dir!" : "It's not a dir"); 

     Console.ReadKey(); 
    } 
} 
+0

Спасибо за ваше решение. Я добавил пару исправлений к вашему решению, чтобы я мог получать папки и файлы по отдельности. Я также избавился от состояния äÄ, поскольку мое приложение также должно поддерживать другие языки. Я опубликую их как два отдельных комментария, чтобы обойти проверку длины комментария. –

+0

Я обновил ваше решение, как показано ниже, чтобы получить файлы. (? <= [\ s]) (?: [a-zA-Z] \: | \\\\ [\ w \.] + \\ [\ w. $] +) \\ (?: [\ w] + \\) * \ w ([\ w.]) + (. архивировано) (? = [\ s \ S]) | (?: [a-zA-Z] \: | \\\\ [ \ ш \] + \\ [\ ш $] +) \\:) | (.. ([\ ш] + \\) * \ ш ([\ ш] + (архивный?..): [\ w] \ S + \ /) * \ w ([\ w.] + (. archived)) –

+0

Для папок я обновил регулярное выражение, подобное этому (? <= [\ s]) (?: [a-zA-Z] \: | \\\\ [\ w \.] + \\ [\ w. $] +) \\ (?: [\ w] + \\) * \ w ([\ w.]) + (. р ^) (= [\ s \ S]) | (?: [A-Za-Z] \: |? \\\\ [. \ ш \] + \\ [. \ ш $] +) \\ (?: [\ w] + \\) * \ w ([\ w.] + (.pj)) | (?: [\ w] \ S + \ /) * \ w ([\ w.] + (. Pj)). Не могли бы вы просмотреть их для любых подводных камней. Благодарю. –

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