正则表达式查找C#async methods with missing";异步;后缀

正则表达式查找C#async methods with missing";异步;后缀,c#,regex,visual-studio,C#,Regex,Visual Studio,在C#中,异步方法(用async关键字标记的方法)的约定之一是,它们的名称应以“async”后缀结尾: 公共异步任务MyMethod(/*params*/) 好孩子,干净代码FTW.:)除了其他答案之外,下面是我如何通过使用grep实用程序来实现这一点: grep '\basync\b' file.cs | grep -v 'Async(' 第一个grep查找其中包含async的所有行(作为一个词),第二个grep将它们过滤为其中不包含async(的行。这里使用Regex: (?i)async

在C#中,异步方法(用
async
关键字标记的方法)的约定之一是,它们的名称应以“async”后缀结尾:


公共异步任务MyMethod(/*params*/) 好孩子,干净代码FTW.:)除了其他答案之外,下面是我如何通过使用
grep
实用程序来实现这一点:

grep '\basync\b' file.cs | grep -v 'Async('
第一个
grep
查找其中包含
async
的所有行(作为一个词),第二个
grep
将它们过滤为其中不包含
async(
的行。

这里使用Regex:

(?i)async.*(?<!async)\(
(?i)异步。*(?)?

它查找关键字async,然后查找“(”而不是(“?)这里有一个关键字也适用于泛型方法和返回结果的方法(可能再次使用泛型)

async(void | Task()?)[^
我已针对以下模式对其进行了测试:

 async void Test()
 async void Test<T>()
 async void Test<T, U>()
 async Task Test()
 async Task Test<T>()
 async Task Test<T, U>()
 async Task<T> Test()
 async Task<T> Test<T>()
 async Task<T> Test<T, U>()
 async Task<T<U>> Test()
 async Task<T<U>> Test<U>()
 async Task<T<U>> Test<T, U>()
异步无效测试()
异步无效测试()
异步无效测试()
异步任务测试()
异步任务测试()
异步任务测试()
异步任务测试()
异步任务测试()
异步任务测试()
异步任务测试()
异步任务测试()
异步任务测试()

您可以使用反射进行单元测试来检查。您对正则表达式了解多少?您是否确实尝试过,或者这只是一个“代码plz”“request?FWIW,ReSharper没有对此发出警告。事实上,当键入方法时,它会自动建议它应该以
Task
@JamesThorpe结尾。真的吗?这是错误的,应该作为错误报告。@usr已经说过,它只是遵循标准行为。很好!我会将它改为@“Task\s+(\w+)(?您添加的“Task”“找不到
async void
方法。并且(?i)在开始时使其不区分大小写。但是捕获该方法以便您可以使用find和replace是非常整洁的。查找async void方法没有意义。它们不能等待,因此它们的名称不应以“async”结尾。抱歉,我的意思是区分大小写,这就是我排除它们的原因”(?i)“.@StevenRands尝试
任务(?:@LzyPanda与其他任务相比,您的正则表达式是迄今为止最快、最准确的。该正则表达式错误地匹配了
公共异步任务getMembersBydAsync()
@Korayem:您使用的是哪个正则表达式引擎?我无法确认这一点。如果没有“async”,表达式将正确匹配在结尾。但是它与结尾的“Async”不匹配。这是它应该工作的方式。请参见以下内容:根据主question@Korayem:我在Visual Studio 2017中尝试了您的示例,但我建议的正则表达式不匹配(这是正确的)我认为你的观察是不正确的。
async void
让人不寒而栗。它还能告诉人们不要这样做吗:P
Task\s+(\w+(?<!Async))\(
 async (void|Task(<.*>)?) [^<\(]*(?<!Async)(?:<.*?>)?\(
 async void Test()
 async void Test<T>()
 async void Test<T, U>()
 async Task Test()
 async Task Test<T>()
 async Task Test<T, U>()
 async Task<T> Test()
 async Task<T> Test<T>()
 async Task<T> Test<T, U>()
 async Task<T<U>> Test()
 async Task<T<U>> Test<U>()
 async Task<T<U>> Test<T, U>()