2

我有,我想在Visual Studio 2015年正則表達式尋找失蹤ConfigureAwait

基本上來搜索特定的模式,我想搜索包含await線,但在聲明的末尾缺少ConfigureAwait

我有一些模式,在正則表達式測試人員如regex101.com工作,但我不能讓這些模式在Visual Studio中的搜索工作。 (例如模式(?s)^(.)*(await)((?!ConfigureAwait).)*(.)?(;)

我做錯了嗎?

編輯 - 我想找到我的項目行如

await DoSomeCoolThings(x, y);

,但我不希望得到線,如馬赫:

(即缺少 ConfigureAwait(...))。

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

+0

刪除'/.../' ...輸入是什麼樣的?請至少張貼一些示例字符串或與在線測試儀小提琴共享鏈接。另外,刪除'(?s)'並用'[\ s \ S \ r]'替換'.'。請注意,'(。)*'是對組進行量化的一種不好的方法 - 由於一個符號被無限次捕獲,它會爲正則表達式引擎創建冗餘開銷。使用'(。*)'(如果你需要捕獲的話)。我認爲大多數捕獲組在這裏是多餘的(直到你澄清你在做什麼)。 –

+1

'(?=。* await)(?!。* ConfigureAwait)'也應該工作 – rock321987

+0

對不起,斜線不是模式的一部分。我已將它們從示例模式中刪除。 – Superhubert

回答

1

如果awaitConfigureAwait的順序並不事,那麼你可以使用

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

否則,如果你認爲ConfigureAwait應該來await後,您可以使用

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

有效解

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

我想知道'ConfigureAwait'可以在'await'之前發生嗎?:)這是第一個未錨定的lookahead在這裏是不必要的複雜化。 –

+0

@WiktorStribiżew我從正則表達式的角度思考.. :) – rock321987

+0

@WiktorStribiżew沒有得到你的第二點! – rock321987

1

來匹配,這些線與await但沒有ConfigureAwait後,你可以使用一個簡單的負先行基於正則表達式:

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

的模式匹配的(.*)緊隨其後,整個單詞await非新行的符號(如\b字界限),然後進行檢查,以確保沒有任何整字ConfigureAwaitawait後某處(與先行(?!.*\bConfigureAwait\b)),然後行的其餘部分與.*匹配。

enter image description here

由於await通常接近字符串的左側,最好是在開始時使用一個懶惰的點匹配:

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

我覺得我們不應該被限制爲單行線,更復雜語句可以分成多個千萬線。此外,該解決方案應該優選是快速的。

爲此,我們既可以使用ReSharper的插件「ConfigureAwait檢查器」,或以下的正則表達式:

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

的想法是找到「等待」這個詞,然後讀取整個語句,直到其分號;,只有在該文本中缺少單詞「ConfigureAwait」時才匹配。更具體地說:

  1. \bawait\b:整個單詞「await」。
  2. (?!...):我們將用於排除已具有ConfigureAwait的匹配的負面預測。
    • [^;]*ConfigureAwait:單詞「ConfigureAwait」,前面有任何數量的不是分號的字符。
  3. [^;]*:任何數目的不是分號的字符。
  4. 分號。

當語句包含查詢字符串(帶分號)或lambda(帶分號)時,我得到了一些小錯誤。他們很容易被忽略,所以我覺得值得讓正則表達式進一步複雜化。