Para entender Expressões Regulares, é preciso conseguir enxergar os padrões das strings.

Um telefone possui o seguinte padrão:

(xx) xxxx-xxxx ou no caso de São Paulo(neste momento): (xx) 9xxxx-xxxx

Sendo cada x, um número 1,2,3,4,5,6,7,8 ou 9.

Eu posso escrever uma ER que case com os telefones assim:

([0-9]{2}) 9?[0-9]{4}-[0-9]{4}

Sendo o 9 ali “opcional”. Para remover a máscara de números de telefone, posso procurar quais são os caracteres que não quero, e tirá-los:

str.replace('(','').replace(')', '').replace(' ','').replace('-','');

Mas isso é deveras trabalhoso.

Eu poderia fazer uma Expressão Regular para pegar todos esses caracteres e remover eles:

str.replace(/[\(\)\.\s-]+/g,'');

Mas ai, tb ainda não tá bacana.

Posso pensar ao contrário: remover tudo, menos oque eu quero:

str.replace(/[^0-9]+/g,'');

Ou seja, removo tudo oque não for números de 0 até 9. Ou se preferir: /[\D]+/g == /[^\d]+/g

Lembrando que \d é o mesmo que [0-9].