2016-11-23 3 views
0

для проверки кода и решения проблем, мне нужно будет упустить все свойства getters в большом решении. Я думаю "Regex и Powershell на помощь".Regex для сопоставления свойства C# getter

Мне нужен шаблон rexeg, который соответствует всем геттерам в файле C#. Например, если это был тест строка:

public string MockFullName 
{ 
    get 
    { 
     string ns = FullName.Substring(0, FullName.Length - Name.Length - 1); 
     return string.Format("{0}.Mock{1}", ns, Name); 
    } 
} 

я нужен матч быть:

get 
{ 
    string ns = FullName.Substring(0, FullName.Length - Name.Length - 1); 
    return string.Format("{0}.Mock{1}", ns, Name); 
} 

Я играл в https://regex101.com/ с рисунком ...

get(.|\n)*{(.|\n)*} 

... который дает мне слишком много назад - включает в себя и закрывающий кронштейн из класса.

Typing это в PowerShell ничего обратно для данного файла C# не дает:

sls 'get(.|\n)*{(.|\n)*}' MyCSharpFileWithAProperty.cs 

Итак, какие из регулярных выражений шаблона удовлетворить бы для этого?

Спасибо, POM

PS: Для записи, я не заинтересованы в краткой форме свойств, и они могут быть пропущены:

public string Name { get; set; } 
+0

Где мой код? – Toto

+0

Пожалуйста, покажите примеры типа кода, который вы * хотите *, чтобы соответствовать, а не только то, что вы * не хотите *, чтобы соответствовать. Кроме того, если вы уже пытались создать регулярное выражение (и вы действительно хотите попробовать себя перед отправкой вопроса), разместите код с этим регулярным выражением и укажите, что с ним не работает. –

+3

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

ответ

1

Предполагая, что ваш файл правильно отступом (то есть: не смешивать язычки & пространства), одно решение использовать следующий код:

Regex r = new Regex(@"get\s*? 
         ^(\s+){ 
         [\s\S]*? 
         ^\1}", RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline); 

var matches = r.Matches(input); 
foreach(Match m in matches) 
{ 
    Console.WriteLine(Regex.Replace(m.Value, "^" + m.Groups[1].Value, "", RegexOptions.Multiline)); 
} 

против:

public string MockFullName 
{ 
    get 
    { 
     string ns = FullName.Substring(0, FullName.Length - Name.Length - 1); 
     return string.Format("{0}.Mock{1}", ns, Name); 
     if(true) 
     { 
      DoStuff(); 
     } 
    } 
} 

public string MockFullName 
{ 
    get 
    { 
     string ns = FullName.Substring(0, FullName.Length - Name.Length - 1); 
     return string.Format("{0}.Mock{1}", ns, Name); 
    } 
} 

Он будет:

get 
{ 
    string ns = FullName.Substring(0, FullName.Length - Name.Length - 1); 
    return string.Format("{0}.Mock{1}", ns, Name); 
    if(true) 
    { 
     DoStuff(); 
    } 
} 

get 
{ 
    string ns = FullName.Substring(0, FullName.Length - Name.Length - 1); 
    return string.Format("{0}.Mock{1}", ns, Name); 
} 
0

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

Match match = Regex.Match(input, @"(get[\S\s]*})\s*}"); 
string asd = match.Groups[1].Value; 

Возможно, ему нужна какая-то настройка, но для начала все в порядке, я думаю.

UPDATE: приведенный выше код может не для методов, содержащих слово «получить», поэтому после небольшой модификации эта модель должна сделать трюк:

@"{\s*(get[\S\s]*})\s*}" 
+0

\ s включает \ r & \ n –

+0

Проверено, и вы правы! Я изменил свой ответ. –

+0

Ницца. Попробуйте это против моего ввода сейчас;) –

0

В C# это будет работать получить \s*\{(?:[^{}]*|(?<open> \{)|(?<-open> \}))+(?(open)(?!))\}, который является слегка модифицированной версией первого awnser к этому Balance parentasis. Если вы используете язык, который использует регулярные выражения prce, вы можете использовать get \ s * ({[^ {}] (? 1)}).

C# one работает, пройдя весь тест и добавив любую открывающую скобу, которую он обнаруживает, чтобы открыть, и если он находит закрывающую скобу, которую он использует? < -open> (.net balancing groups), чтобы удалить последнее совпадение группы. это откладывается на макт для этого. Если совпадений нет, то это не дает результата, это позволяет регулярному выражению балансировать скобки. В конце он использует (? (Open) (?!)), чтобы проверить, нет ли оставшихся совпадений в открытом состоянии, если это не удается. Это означает, что количество скобок должно совпадать.

Надеюсь, это то, что вы хотите.

0

Не регулярное выражение, также не пользовательское отражение или Roslyn. Вы считаете NDepend?

  • Его CQLinq синтаксис позволяет запросить все добытчиками в проекте
  • Вы можете интегрировать его в существующую установку CI: Define предупреждения об ошибках и пороговых значений, основанных на запросах CQlinq; вы можете увидеть их как защитные качества кода. Например, ошибки могут «останавливать» CI.
  • Его там из коробки и предлагает множество других функций проверки и проверки. Не нужно инвестировать в собственное решение.

Пример изображения, показывающего результаты запроса (обратите внимание на примеры для методов not Properties).

example quering for methods

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