2

У меня есть определенный шаблон, который я хочу, чтобы искать в Visual Studio 2015.Regex найти недостающие ConfigureAwait

В принципе, я хочу, чтобы найти строки, которая содержит await, но не хватает ConfigureAwait в конце заявления ,

У меня есть несколько шаблонов, которые работают в regex-testers, таких как regex101.com, но я не могу заставить эти шаблоны работать в Visual Studio. (Например, шаблон (?s)^(.)*(await)((?!ConfigureAwait).)*(.)?(;).)

Что я делаю неправильно?

Edit - Я хочу, чтобы найти строки в моем проекте, таких как

await DoSomeCoolThings(x, y);

, но я не хочу, чтобы получить Маха для линий, таких как:

(Т.е. с отсутствующим ConfigureAwait(...).)

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

+0

Удалить «/.../» ... Как выглядит ввод? Пожалуйста, разместите несколько строк примера или поделитесь ссылкой на скрипт онлайн-тестера. Кроме того, удалите '(? S)' и заменим '.' на' [\ s \ S \ r] '. Обратите внимание, что '(.) *' - плохой подход к количественному определению групп - поскольку один символ захватывается бесконечно много раз, он создает избыточные накладные расходы для двигателя регулярных выражений. Используйте '(. *)' (Если вам нужно вообще захватить). Я думаю, что большинство групп захвата здесь избыточны (пока вы не уточните, что вы делаете). –

+1

'(? =. * Wait) (?!. * ConfigureAwait)' также должен работать – rock321987

+0

Извините, косые черты не являются частью шаблона. Я удалил их из своего шаблона. – Superhubert

ответ

1

Если порядок await и ConfigureAwait не Вы можете использовать

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

в противном случае, если вы считаете, что ConfigureAwait должен прийти после await, вы можете использовать

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

Эффективное решение

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

Интересно, как «ConfigureAwait» может появиться до 'await' :) Этот первый необъявленный просмотр - ненужное осложнение здесь. –

+0

@ WiktorStribiżew Я думал об этом с точки зрения regex .. :) – rock321987

+0

@ WiktorStribiżew не получил ваш второй балл !! – rock321987

1

Для согласования этих строк с await но без ConfigureAwait после этого, вы можете использовать более простое отрицательное регулярное выражение на основе опережения:

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

соответствует любому не-новым строке символов (.*), а затем с целым словом await (как \b являются границами слов), а затем выполняются проверка, чтобы убедиться, что нет целого слова ConfigureAwait где-то после await (с таблицей (?!.*\bConfigureAwait\b)), а затем остальная часть линии соответствует .*.

enter image description here

Поскольку await обычно близко к левой стороне строки, лучше всего использовать ленивое соответствие точки в начале:

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

Я не думаю, что мы должны быть ограничены до одной строки, как более сложные высказывания можно разделить на несколько линий. Кроме того, раствор предпочтительно должен быть быстрым.

С этой целью, мы можем либо использовать Resharper плагин «ConfigureAwait Checker», или следующее регулярное выражение:

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

Идея заключается в том, чтобы найти слово «ждет», а затем прочитать все заявление до его точка с запятой ;, соответствующая только в том случае, если в этом тексте отсутствует слово «ConfigureAwait».В частности:

  1. \bawait\b: Всего слова «ждут».
  2. (?!...): Отрицательный взгляд, который мы будем использовать для исключения совпадений, которые уже имеют ConfigureAwait.
    • [^;]*ConfigureAwait: Слово «ConfigureAwait», которому предшествует любое количество символов, которые не являются точкой с запятой.
  3. [^;]*: Любое количество символов, которые не являются точкой с запятой.
  4. Точка с запятой.

У меня появилось несколько незначительных ложных срабатываний, в которых оператор содержит строку запроса (с точкой с запятой) или лямбда (с точкой с запятой). Их так легко игнорировать, что я не счел нужным еще больше усложнять регулярное выражение.

Смежные вопросы