Найти Regex для текста в файле решения Visual Studio - PullRequest
1 голос
/ 23 января 2020

Я хочу найти проекты, включенные в файл решения. Я создал регулярное выражение для этой цели, когда я запускаю регулярное выражение в онлайн-компиляторе, оно работает нормально, но в моем локальном приложении это не работает. Вот как regex

Regex на моей машине:

@"Project\(""(\{.*\})""\)\s*=\s*""(myproject)""\s*,\s*""(.*)""\s*,\s*""(.*)""[\s*\n*\s*]EndProject"

Regex онлайн компилятор:

Project\("(\{.*\})"\)\s*=\s*"(myproject)"\s*,\s*"(.*)"\s*,\s*"(.*)"[\s*\n*\s*]EndProject

Мой код:

Regex Pattern = new Regex(pattern);
var inputLines = File.ReadAllText(path);
var matches = Pattern.Matches(inputLines);

Образец текста

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29613.14
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "myproject", "myproject.csproj", "{96C046DE-705D-4984-9414-124B6A6EA28E}"
EndProject
Global
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
        Release|Any CPU = Release|Any CPU
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {96C046DE-705D-4984-9414-124B6A6EA28E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {96C046DE-705D-4984-9414-124B6A6EA28E}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {96C046DE-705D-4984-9414-124B6A6EA28E}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {96C046DE-705D-4984-9414-124B6A6EA28E}.Release|Any CPU.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
    EndGlobalSection
    GlobalSection(ExtensibilityGlobals) = postSolution
        SolutionGuid = {B766FA40-EBEF-4E79-A5B1-04BE348D4793}
    EndGlobalSection
EndGlobal

1 Ответ

2 голосов
/ 23 января 2020

Ваш [\s*\n*\s*] (равен [\s*]) соответствует только одному символу, либо пробелу, либо *. В вашем файле вы должны иметь окончания строк CRLF ("\r\n"), и комбинация из двух символов не может быть сопоставлена ​​с этим шаблоном.

Обратите внимание, что большинство онлайн-компиляторов регулярных выражений имеют только LF как последовательность окончания строки, поэтому вы получили соответствие с вашим шаблоном. Вы можете использовать RegexStorm для проверки. NET шаблонов с текстом, содержащим окончания CRLF (с моей стороны не связан с веб-сайтом).

Вы должны использовать

var Pattern = new Regex(@"Project\(""({.*?})""\)\s*=\s*""(myproject)""\s*,\s*""(.*?)""\s*,\s*""(.*?)""\s*EndProject");
var inputLines = File.ReadAllText(path);
var matches = Pattern.Matches(inputLines);

Обратите внимание на часть \s*EndProject, где \s* соответствует любым 0 или более пробельным символам. Если наверняка есть разрыв строки, вы также можете использовать \s+ для соответствия любому 1 или более пробелам.

Я также изменил все жадные .* шаблоны с их ленивыми (не жадными) аналогами для лучшая производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...