Если вы хотите 100% рабочий раствор, то регулярное выражение не будет отвечать всем требованиям. Слишком легко запутать регулярное выражение реальным кодом. Возьмем, к примеру, следующее регулярное выражение
"^\s*if\W[^{]*\n\s*[^{]"
Это будет соответствовать значительному большинству операторов if, которые не заключены в фигурные скобки. Однако это может быть легко сломано. Возьмите следующие образцы. Регулярное выражение будет неправильно помечать их как будто операторы с фигурными скобками.
Пример 1
if ( SomeFunction(() => { return 42; }) )
Пример 2
/* Big comment
if ( true ) {
*/
Список можно продолжать и продолжать.
Итог: если вы хотите совершенства, регулярное выражение не будет работать. Если вы удовлетворены менее совершенным решением, то вышеприведенное регулярное выражение должно сработать.