【问题标题】:Regex to find missing ConfigureAwait正则表达式查找丢失的 ConfigureAwait
【发布时间】:2016-04-19 06:57:24
【问题描述】:

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

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

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

我做错了什么?

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

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

但我不想匹配以下行:

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

【问题讨论】:

  • 删除/.../... 输入是什么样的?请至少发布一些示例字符串或分享到在线测试器小提琴的链接。另外,删除(?s) 并将. 替换为[\s\S\r]。请注意,(.)* 是量化组的一种糟糕方法——因为一个符号被无限次捕获,它为正则表达式引擎带来了冗余开销。使用(.*)(如果您需要捕获)。我认为大多数捕获组在这里都是多余的(直到你澄清你在做什么)。
  • (?=.*await)(?!.*ConfigureAwait) 也应该可以工作
  • 抱歉,斜线不是模式的一部分。我已将它们从我的示例模式中删除。
  • @rock321987 - 这行得通。谢谢!
  • 很高兴,它对你有用

标签: regex visual-studio async-await configureawait


【解决方案1】:

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

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

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

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

高效解决方案

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

【讨论】:

  • 我想知道ConfigureAwait 怎么会出现在await 之前:) 第一个未锚定的前瞻在这里是不必要的复杂化。
  • @WiktorStribiżew 我是从正则表达式的角度考虑的..:)
  • 如果文档很大,您的正则表达式会减慢匹配速度,因为在在文本中的每个位置都会检查未锚定的环视。你看,在我的表达中,首先抓取整行,然后回溯找到await,然后触发负前瞻。在您的情况下,引擎会检查字符串的开头:抓取所有、回溯、是否找到、触发负前瞻,然后在每个位置、每个字符之前继续这样。当涉及到全局匹配时,这是非常低效的,并且是不好的做法(比如这里,/g 是隐含的)。
  • @WiktorStribiżew 等等..但调试器模式并没有这么说..你能澄清一下吗
  • (我想我删除了我的评论):对不起,我的意思是突出显示。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 2011-08-22
      • 2014-08-01
      • 2011-11-19
      • 1970-01-01
      • 2021-07-22
      • 2011-08-03
      相关资源
      最近更新 更多