正则表达式查找丢失的 ConfigureAwait

Regex to find missing ConfigureAwait

我想在 Visual Studio 中搜索一个特定的模式。

基本上,我想搜索包含 await 但在语句末尾缺少 ConfigureAwait 的行。

我有一些在正则表达式测试器中工作的模式,例如 regex101.com,但我无法让这些模式在 Visual Studio 搜索中工作。例如,模式 (?s)^(.)*(await)((?!ConfigureAwait).)*(.)?(;).

我做错了什么?

编辑 - 我想在我的项目中找到行,例如

await DoSomeCoolThings(x, y);(即缺少 ConfigureAwait(...)。)

但我不想匹配以下行:

await DoSomeCoolThings(x, y).ConfigureAwait(false);

要将这些行与 await 匹配但后面没有 ConfigureAwait,您可以使用更简单的基于负前瞻的正则表达式:

.*\bawait\b(?!.*\bConfigureAwait\b).*

该模式匹配任何非换行符号 (.*) 后跟整个单词 await(因为 \b 是单词边界),然后执行检查以确保在 await 之后的某处没有完整的单词 ConfigureAwait(先行 (?!.*\bConfigureAwait\b)),然后行的其余部分与 .*.

匹配

由于await通常靠近字符串的左侧,所以最好在开头使用惰性点匹配:

.*?\bawait\b(?!.*\bConfigureAwait\b).*

如果awaitConfigureAwait的顺序无所谓,那么可以用

(?=.*\bawait\b)(?!.*\bConfigureAwait\b)

否则,如果你认为ConfigureAwait应该在await之后,你可以使用

(?=.*\bawait\b(?!.*\bConfigureAwait\b))

高效解决方案

(?=\bawait\b(?!.*\bConfigureAwait\b))

我认为我们不应该被限制在一行中,因为更复杂的语句可以分成多行。此外,解决方案最好是快速的。

为此,我们可以使用 Resharper 插件 "ConfigureAwait Checker",或以下正则表达式:

\bawait\b(?![^;]*ConfigureAwait)[^;]*;

想法是找到单词 "await",然后阅读整个语句直到它的分号 ;,仅当该文本中缺少单词 "ConfigureAwait" 时才匹配。更具体地说:

  1. \bawait\b: 整个单词 "await".
  2. (?!...):否定前瞻,我们将使用它来排除已经具有 ConfigureAwait 的匹配项。
    • [^;]*ConfigureAwait:单词 "ConfigureAwait",前面有任意数量的非分号字符。
  3. [^;]*: 分号以外的任意数量的字符。
  4. 分号。

我遇到了一些小误报,其中语句包含查询字符串(带分号)或 lambda(带分号)。它们很容易被忽略,以至于我觉得不值得进一步复杂化正则表达式。