Я думаю /^(\$){0,1}[_a-zA-Z][a-zA-Z0-9_]*([?!]){0,1}$/
немного ближе к тому, что вам нужно ...
Это зависит от того, хотите ли вы также сопоставить имена методов.
Если вы пытаетесь сопоставить имя, которое может встречаться в выражении, то оно может начинаться с $, а может заканчиваться на? или же !. Если вы точно знаете, что это просто локальная переменная, тогда правило будет намного проще.