正则表达式查找丢失的 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).*
如果await
和ConfigureAwait
的顺序无所谓,那么可以用
(?=.*\bawait\b)(?!.*\bConfigureAwait\b)
否则,如果你认为ConfigureAwait
应该在await
之后,你可以使用
(?=.*\bawait\b(?!.*\bConfigureAwait\b))
高效解决方案
(?=\bawait\b(?!.*\bConfigureAwait\b))
我认为我们不应该被限制在一行中,因为更复杂的语句可以分成多行。此外,解决方案最好是快速的。
为此,我们可以使用 Resharper 插件 "ConfigureAwait Checker",或以下正则表达式:
\bawait\b(?![^;]*ConfigureAwait)[^;]*;
想法是找到单词 "await",然后阅读整个语句直到它的分号 ;
,仅当该文本中缺少单词 "ConfigureAwait" 时才匹配。更具体地说:
\bawait\b
: 整个单词 "await".
(?!...)
:否定前瞻,我们将使用它来排除已经具有 ConfigureAwait 的匹配项。
[^;]*ConfigureAwait
:单词 "ConfigureAwait",前面有任意数量的非分号字符。
[^;]*
: 分号以外的任意数量的字符。
- 分号。
我遇到了一些小误报,其中语句包含查询字符串(带分号)或 lambda(带分号)。它们很容易被忽略,以至于我觉得不值得进一步复杂化正则表达式。
我想在 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).*
如果await
和ConfigureAwait
的顺序无所谓,那么可以用
(?=.*\bawait\b)(?!.*\bConfigureAwait\b)
否则,如果你认为ConfigureAwait
应该在await
之后,你可以使用
(?=.*\bawait\b(?!.*\bConfigureAwait\b))
高效解决方案
(?=\bawait\b(?!.*\bConfigureAwait\b))
我认为我们不应该被限制在一行中,因为更复杂的语句可以分成多行。此外,解决方案最好是快速的。
为此,我们可以使用 Resharper 插件 "ConfigureAwait Checker",或以下正则表达式:
\bawait\b(?![^;]*ConfigureAwait)[^;]*;
想法是找到单词 "await",然后阅读整个语句直到它的分号 ;
,仅当该文本中缺少单词 "ConfigureAwait" 时才匹配。更具体地说:
\bawait\b
: 整个单词 "await".(?!...)
:否定前瞻,我们将使用它来排除已经具有 ConfigureAwait 的匹配项。[^;]*ConfigureAwait
:单词 "ConfigureAwait",前面有任意数量的非分号字符。
[^;]*
: 分号以外的任意数量的字符。- 分号。
我遇到了一些小误报,其中语句包含查询字符串(带分号)或 lambda(带分号)。它们很容易被忽略,以至于我觉得不值得进一步复杂化正则表达式。