我有一个特定的模式,我想在Visual Studio 2015中搜索。
基本上,我想搜索包含await
的行,但在语句末尾缺少ConfigureAwait
。
我有一些模式适用于regex测试人员,例如regex101.com,但我无法在Visual Studio搜索中使用这些模式。 (例如模式(?s)^(.)*(await)((?!ConfigureAwait).)*(.)?(;)
。)
我做错了什么?
编辑 - 我想在项目中找到行,例如
await DoSomeCoolThings(x, y);
(即我错过了ConfigureAwait(...)
。)
但是我不想为以下行提供马赫:
await DoSomeCoolThings(x, y).ConfigureAwait(false);
答案 0 :(得分:1)
要将这些行与await
但后面没有ConfigureAwait
相匹配,您可以使用更简单的基于正面的否定前瞻:
.*\bawait\b(?!.*\bConfigureAwait\b).*
模式匹配任何非换行符号(.*
),后跟整个单词await
(因为\b
是单词边界),然后执行检查以确保存在在ConfigureAwait
之后的某个地方(前瞻await
)没有完整的单词(?!.*\bConfigureAwait\b)
,然后其余部分与.*
匹配。
由于await
通常靠近字符串的左侧,因此最好在开头使用惰性点匹配:
.*?\bawait\b(?!.*\bConfigureAwait\b).*
答案 1 :(得分:1)
如果await
和ConfigureAwait
的顺序无关紧要,那么您可以使用
(?=.*\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”时才匹配。更具体地说:
;
:全文“等待”。\bawait\b
:我们将用于排除已有ConfigureAwait的匹配项的否定预测。
(?!...)
:单词“ConfigureAwait”,前面是任意数量不是分号的字符。[^;]*ConfigureAwait
:任意数量不是分号的字符。我得到了一些小的误报,其中语句包含查询字符串(带分号)或lambda(带分号)。它们很容易被忽略,我觉得没有必要进一步使正则表达式复杂化。