正则表达式找到丢失的ConfigureAwait

时间:2016-04-19 06:57:24

标签: regex visual-studio visual-studio-2015 async-await configureawait

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

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

我有一些模式适用于regex测试人员,例如regex101.com,但我无法在Visual Studio搜索中使用这些模式。 (例如模式(?s)^(.)*(await)((?!ConfigureAwait).)*(.)?(;)。)

我做错了什么?

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

await DoSomeCoolThings(x, y);(即我错过了ConfigureAwait(...)。)

但是我不想为以下行提供马赫:

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

3 个答案:

答案 0 :(得分:1)

要将这些行与await但后面没有ConfigureAwait相匹配,您可以使用更简单的基于正面的否定前瞻:

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

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

enter image description here

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

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

答案 1 :(得分:1)

如果awaitConfigureAwait的顺序无关紧要,那么您可以使用

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

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

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

高效解决方案

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

答案 2 :(得分:0)

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

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

Linux

想法是找到单词“await”,然后读取整个语句直到它的分号\bawait\b(?![^;]*ConfigureAwait)[^;]*; ,只有在该文本中缺少单词“ConfigureAwait”时才匹配。更具体地说:

  1. ;:全文“等待”。
  2. \bawait\b:我们将用于排除已有ConfigureAwait的匹配项的否定预测。
    • (?!...):单词“ConfigureAwait”,前面是任意数量不是分号的字符。
  3. [^;]*ConfigureAwait:任意数量不是分号的字符。
  4. 分号。
  5. 我得到了一些小的误报,其中语句包含查询字符串(带分号)或lambda(带分号)。它们很容易被忽略,我觉得没有必要进一步使正则表达式复杂化。