An algorithm for comparing a DFA and a regular expression
This technique I am going to describe works to compare two NFAs. Fortunately, you have mentioned that you know how to convert your regular expression into an NFA and it is trivial to convert your DFA into an NFA. (just treat the DFA as though it were an NFA)

Once you have your two NFAs, add two new symbols to your alphabet: $\$_1$ and $\$_2$. We're going to construct a larger NFA by combining the two NFAs that we have. Add a node (call it $\omega$), and add edges from every accepting node in the first NFA to node $\omega$ labeled with $\$_1$. Now add edges from every accepting node in the second NFA to node $\omega$ labeled with $\$_2$.

Now add another node (call it $\alpha$) and add epsilon-transition edges from $\alpha$ to the initial node in each NFA. (so $\alpha$ has only two edges leaving it). (alternatively, since some people don't like epsilon transitions, you can instead add to $\alpha$ all the outgoing edges of the initial nodes in each original NFA)

Now take this combined graph with the two extra nodes as an NFA: the initial node is $\alpha$, and the only accepting node in the combined graph is $\omega$.

Turn this NFA into a DFA. One side-effect of how we constructed edges into $\omega$ is that the DFA will have only a single accepting state. The two original languages will be identical if and only if in the DFA every edge going to this accepting node is labeled with both $\$_1$ and $\$_2$.

Essentially, what we did was form the languages:
\begin{align}
L_1 &amp;= \{ w \ \$_1 \  | \ w \in L(M)\} \\
L_2 &amp;= \{ v \ \$_2 \  | \ v \in L(r)\}
\end{align}
and then our combined NFA was the NFA for the language $L_1 \cup L_2$. The statement about the edges of the DFA says that there exists some set $A$ such that the language of our DFA is
$$\{a \ x \ | \ a \in A, x \in \{\$_1, \$_2\} \}$$
But this implies that if you stripped the $\$_i$ symbols off the end of the strings in $L_1$ and $L_2$ you'd have the same language.



Incidentally, you can use this DFA for $L_1 \cup L_2$ to easily construct DFAs for $L(M) \cap L(r)$, for $L(M) \cup L(r)$, for $L(M) \setminus L(r)$, for $L(r) \setminus L(M)$, and for the symmetric difference of $L(M)$ and $L(r)$. The exact details are left as an exercise for the reader, but it involves examining nodes with outgoing edges labeled with one of the $\$_i$ symbols, labeling some of those nodes as accepting nodes, and then erasing all edges labeled with the $\$_i$ symbols.

(These won't necessarily be minimal DFAs, even if you minimized the DFA before erasing the $\$_i$ edges. You'll need to apply standard DFA minimization algorithms if you want that.)