I think you'd be better off leaving regular expressions out of the mix.
What I would do is convert the value to an int and round off the decimal, then check if it's negative. I would also check whether the first character is a dollar sign and, if so, just remove it. The code would be simpler and more readable that way IMO, and if someone did enter 12.34512 or .1, the system would still work.
//untested
$amount = "$0.12"
if( $amount && $amount[0] == '$' ) {
ltrim($amount, '$');
}
$int_amount = (int) $amount;
$int_amount = round($int_amount, 2);
if( $amount <= 0 ) {
//error
}
That being said, I don't know whether you have to use regexp for whatever reason (like if you have a validation function that takes a value and regexp as arguments), but in a case like this I think being liberal in the price format would be better so as not to tell users that they entered an "invalid amount" when they input 12 cents without a leading zero.