为了进行代码审查和解决问题,我需要能够忽略大型解决方案中的所有属性获取者。我正在思考" 正则表达式和 Powershell 来拯救"。
我需要一个匹配C#文件中所有getter的 rexeg模式。 例如,如果这是测试字符串:
public string MockFullName
{
get
{
string ns = FullName.Substring(0, FullName.Length - Name.Length - 1);
return string.Format("{0}.Mock{1}", ns, Name);
}
}
我需要匹配 be:
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)*}
...这让我太过分了 - 包括课堂上的结束括号。
在PowerShell中键入此内容并不能为给定的C#文件提供任何内容:
sls 'get(.|\n)*{(.|\n)*}' MyCSharpFileWithAProperty.cs
那么,什么样的正则表达式会迎合这个?
谢谢, POM
PS:对于记录,我不对短格式属性感兴趣,可以跳过它们:
public string Name { get; set; }
答案 0 :(得分: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);
}
答案 1 :(得分:0)
试试这个:
int count = //get the total number of such records from the database
if (comboBox4.SelectedIndex != (count -1))
{
comboBox4.SelectedIndex = comboBox4.SelectedIndex + 1;
}
也许它需要一些定制,但是一开始我觉得很好。
更新: 对于包含单词“get”的方法,上面的代码可能会失败,因此经过一点修改后,这个模式应该可以解决问题:
Match match = Regex.Match(input, @"(get[\S\s]*})\s*}");
string asd = match.Groups[1].Value;
答案 2 :(得分:0)
在c#中,这将得到\s*\{(?:[^{}]*|(?<open> \{ )|(?<-open> \}))+(?(open)(?!))\}
,这是对此2014 W3C Recommendation的第一个awnser的略微修改版本。如果您使用的是影响prce正则表达式的语言,则可以使用get \ s *({[^ {}] (?1)})。
c#one的工作原理是通过所有测试并添加它找到的任何开口括号,如果它找到一个结束括号,它会使用?&lt; -open&gt; (.net balance groups)删除组打开的最后一个匹配项。这又回到了那个问题上。如果没有匹配可用,则失败,这允许正则表达式平衡括号。最后它使用(?(打开)(?!))来检查打开时是否有剩余的匹配,如果有失败的话。这有效地意味着支架的数量必须匹配。
我希望这就是你想要的。
答案 3 :(得分:0)
不是正则表达式,也不是自定义反射或Roslyn。你考虑过NDepend了吗?
显示查询结果的示例图像(注意方法而非属性的示例查询)。