emacs(lisp)で、リージョン中の内容をre-search-forwardとreplace-matchなどの組み合わせで置換していくときに、構文のfooは置換したいけれど、文字列中のfooは置換したくない、という場合は、どうするのが定石なのでしょうか。

foo "foo" foo Foo
=> bar "foo" bar Foo

という風に置換したい場合の定石があれば教えて下さい。