Regex, чтобы найти отсутствующий ConfigureAwait
У меня есть определенный шаблон, который я хочу найти в Visual Studio 2015.
В основном, я хочу искать строки, которые содержат await
, но отсутствуют ConfigureAwait
в конце заявления.
У меня есть несколько шаблонов, которые работают в regex-testers, таких как regex101.com, но я не могу заставить эти шаблоны работать в поиске Visual Studio. (Например, шаблон (?s)^(.)*(await)((?!ConfigureAwait).)*(.)?(;)
.)
Что я делаю не так?
Изменить - я хочу найти строки в моем проекте, такие как
await DoSomeCoolThings(x, y);
(Т. Е. Отсутствует ConfigureAwait(...)
.)
но я не хочу получать Mach для строк, таких как:
await DoSomeCoolThings(x, y).ConfigureAwait(false);
3 ответа
Если порядок await
а также ConfigureAwait
не имеет значения, то вы можете использовать
(?=.*\bawait\b)(?!.*\bConfigureAwait\b)
в противном случае, если вы считаете, что ConfigureAwait
должен прийти после await
, ты можешь использовать
(?=.*\bawait\b(?!.*\bConfigureAwait\b))
Эффективное решение
(?=\bawait\b(?!.*\bConfigureAwait\b))
Я не думаю, что мы должны ограничиваться одной строкой, так как более сложные выражения можно разбить на несколько строк. Также решение должно быть предпочтительно быстрым.
Для этого мы можем использовать плагин Resharper "ConfigureAwait Checker" или следующее регулярное выражение:
\bawait\b(?![^;]*ConfigureAwait)[^;]*;
Идея состоит в том, чтобы найти слово "ждать", а затем прочитать все утверждение до его точки с запятой ;
соответствие только в том случае, если в этом тексте отсутствует слово "ConfigureAwait". Более конкретно:
\bawait\b
: Целое слово "жду".(?!...)
: Негативный прогноз, который мы будем использовать для исключения совпадений, у которых уже есть ConfigureAwait.[^;]*ConfigureAwait
: Слово "ConfigureAwait", которому предшествует любое количество символов, не являющихся точкой с запятой.
[^;]*
Любое количество символов, которые не являются точкой с запятой.- Точка с запятой.
Я получил несколько незначительных ложных срабатываний, где оператор содержит строку запроса (с точкой с запятой) или лямбду (с точкой с запятой). Их так легко игнорировали, что я не нашел смысла в дальнейшем усложнять регулярное выражение.
Чтобы сопоставить эти строки с await
но без ConfigureAwait
после этого вы можете использовать более простое регулярное выражение с отрицательным прогнозом:
.*\bawait\b(?!.*\bConfigureAwait\b).*
Шаблон соответствует любым не символам новой строки (.*
) с целым словом await
(как \b
являются границами слов), а затем выполняется проверка, чтобы убедиться, что нет целого слова ConfigureAwait
где-то после await
(с предвкушением (?!.*\bConfigureAwait\b)
), а затем остаток строки сопоставляется с .*
,
поскольку await
обычно находится близко к левой стороне строки, лучше всего использовать ленивое сопоставление точек в начале:
.*?\bawait\b(?!.*\bConfigureAwait\b).*