var expr = /^[a-zA-Z0-9]*$/

ma come mai ci va ^ e poi anche $?
Significa che viene controllata la presenza di caratteri alfanumerici all'inizio e alla fine della stringa.
Non è identico scrivere

var expr = /[a-zA-Z0-9]* /

??
Questo non li cerca comunque sia all'inizio che alla fine?